可持久化并查集离线做法求助 但是删了按秩合并一些WA的变A
  • 板块学术版
  • 楼主___A__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/7 23:03
  • 上次更新2023/11/8 13:40:59
查看原帖
可持久化并查集离线做法求助 但是删了按秩合并一些WA的变A
275860
___A__楼主2023/11/7 23:03
#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 find(f[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	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])){
		    if(size[find(a[u])]<size[find(b[u])]){
		        swap(a[u],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;
		}
		else{
		    for(int v:g[u]){
			    dfs(v);
		    }
		}
	}
	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/7 23:03
加载中...