题目链接: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;
}