可持久化并查集板子离线做法求助
  • 板块学术版
  • 楼主___A__
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/6 21:01
  • 上次更新2023/11/6 21:18:20
查看原帖
可持久化并查集板子离线做法求助
275860
___A__楼主2023/11/6 21:01
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int size[N],f[N],n,m,a[N],b[N],ans[N],opt[N];
vector<int>g[N];
int find(int x){
	if(f[x]==x){
		return x;
	}
	return f[x]=find(f[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	//y向x和并
	if(size[fy]>size[fx]){
		merge(y,x);
		return;
	}
	size[fx]+=size[fy],size[fy]=0,f[fy]=fx;
}
void dfs(int u){
	if(opt[u]==1){
		if(find(a[u])!=find(b[u])){
			int fx=find(a[u]),fy=find(b[u]),sizex=size[fx],sizey=size[fy];
		    merge(a[u],b[u]);
		    for(int v:g[u]){
			    dfs(v);
		    }
		    f[a[u]]=fx,f[b[u]]=fy,size[fx]=sizex,size[fy]=sizey;
		}
	}
	if(opt[u]==2){
		for(int v:g[u]){
			dfs(v);
		}
	}
	if(opt[u]==3){
		ans[u]=(find(a[u])==find(b[u]));
		for(int v:g[u]){
			dfs(v);
		}
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i]=i,size[i]=1;
	}
	for(int i=1;i<=m;i++){
		cin>>opt[i]>>a[i];
		if(opt[i]!=2){
			cin>>b[i];
		}
		if(opt[i]==2){
			g[a[i]].push_back(i);
		}
		else{
			g[i-1].push_back(i);
		}
	}
	opt[0]=2;
	dfs(0);
	for(int i=1;i<=m;i++){
		if(opt[i]==3){
			cout<<ans[i]<<'\n';
		}
	}
}
2023/11/6 21:01
加载中...