Codeforces - Connected Components

题目链接:Codeforces - Connected Components


前缀和优化Dsu。

我们可以发现每次只是少一段区间,所以如果我们记录前缀Dsu,以及后缀Dsu,处理就是O(n)的了。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e4+10;
int n,m,q,x[N],y[N];
struct Dsu{
	int f[510],sz;
	inline void init(){for(int i=1;i<=n;i++)	f[i]=i;}
	int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
	inline void merge(int x,int y){x=find(x),y=find(y); if(x!=y) f[x]=y,sz++;}
}l[N],r[N],res;
signed main(){
	cin>>n>>m;	l[0].init(),r[m+1].init();
	for(int i=1;i<=m;i++)	cin>>x[i]>>y[i];
	for(int i=1;i<=m;i++)	l[i]=l[i-1],l[i].merge(x[i],y[i]);
	for(int i=m;i>=1;i--)	r[i]=r[i+1],r[i].merge(x[i],y[i]);
	cin>>q;
	while(q--){
		int ql,qr;	cin>>ql>>qr; res=l[ql-1];
		for(int i=1;i<=n;i++)	if(r[qr+1].f[i]!=i)	res.merge(i,r[qr+1].f[i]);
		cout<<n-res.sz<<'\n';
	}
	return 0;
}
发布了553 篇原创文章 · 获赞 242 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104226058
今日推荐