专栏文章

2025寒假专场5

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqjx6n7
此快照首次捕获于
2025/12/04 06:01
3 个月前
此快照最后确认于
2025/12/04 06:01
3 个月前
查看原文
模拟
模拟
求连通性,可以dfs, bfs, 并查集
枚举每一个草莓,利用二分确定是在哪个块当中!
假设草莓的位置是(x,y),那么草莓一定会出现在第一个比x大的平行x轴的切线 以及第一个比y大的平行y轴的切线 的方格内。
利用mapmap对每个草莓进行统计,然后再找出那个方格的数量最少喝最多就可以。
特殊情况:最后统计的方格的数量有cntcnt个方格存在草莓,若cnt<(A+1)(B+1)cnt < (A+1) * (B + 1)则,说明最小值为00.
CPP
#include<bits/stdc++.h>
using namespace std;
const int mxv = 2e5 + 9;
#define int long long
int w, h, n;
pair<int, int> p[mxv];
int a[mxv],b[mxv],cnta,cntb;
map<pair<int,int>, int> mp;
void solve(){
	cin >> w >> h >> n;
	for(int i = 1;i <= n; i++) cin >> p[i].first >> p[i].second;// 草莓位置 
	cin >> cnta;
	for(int i = 1; i <= cnta; i++) cin >> a[i];  
	cin >> cntb;
	for(int i = 1; i <= cntb; i++) cin >> b[i];
	
	a[++cnta] = w; b[++cntb] = h;
	
	sort(a + 1, a + 1 + cnta);
	sort(b + 1, b + 1 + cntb);
	
	for(int i = 1; i <= n; i++){
		int x = p[i].first, y = p[i].second;
		int xx = lower_bound(a + 1, a + 1 + cnta, x) - a;
		int yy = lower_bound(b + 1, b + 1 + cntb, y) - b;
		mp[{xx, yy}]++;
	}
	
	int min1 = 1e18, max1 = -1e18, cnt = 0;
	for(auto t: mp){
		int y = t.second;
		min1 = min(min1, y);
		max1 = max(max1, y);
		cnt++;
	}
	if(cnt < cnta * cntb) min1 = 0;
	cout << min1 << " " << max1 << "\n";
	return;
}
signed main(){
	int t=1;
	while(t--) solve();
	return 0;
}
并查集
kk对不能连通的点,意味着他们所处的集合是不能相通。
每次添加都是独立的,求解的问题是单独的。
每天添加一条边,只要检查看看,这两个集合是否是可以相通的即可。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, k, q;
int fa[N];
map< pair<int, int>, int > mp;

int find(int x){
	if(x != fa[x]) return fa[x] = find(fa[x]);
	return x;
}

void merge(int u, int v){
	u = find(u), v = find(v);
	if(u != v) fa[u] = v;
}

void solve(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) fa[i] = i;
	for(int u, v, i = 1; i <= m; i++){
		scanf("%d%d", &u, &v);
		if(u == v) continue;
		merge(u, v);
	}
	
	scanf("%d", &k);
	
	for(int x, y, i = 1; i <= k; i++){
		scanf("%d%d", &x, &y);
		int xx = find(x), yy = find(y);
		mp[{xx, yy}] = -1;
	}
	
	scanf("%d", &q);
	while(q--){
		int x, y;
		scanf("%d%d", &x, &y);
		int xx = find(x), yy = find(y);
		if(mp[{xx, yy}] != -1 && mp[{yy, xx}] != -1)	
			puts("Yes");
		else
			puts("No"); 
	}
}
int main(){
	solve();
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...