→←
【想说的话】
rope大法好!!!!!
【题解】
用rope来实现可持久化并查集
rp[i]->at(x) 访问下标为x的元素的值
rp[i]->replace(pos,x) 将下标为pos的元素的值更改为x
rp[i]=new rope<int>(*rp[y]) 将rp[y]整个复制到rp[i]
【代码】
#include<bits/stdc++.h>
#include<ext/rope>
#define MAXN 20020
using namespace std;
using namespace __gnu_cxx;
inline int rd(){
int x=0,y=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*y;
}
int n,m;
rope<int> *rp[MAXN];
int a[MAXN];
inline int fa(int i,int x){
return rp[i]->at(x);
}
int getroot(int i,int x){
if(fa(i,x)==x)return x;
rp[i]->replace(x,getroot(i,fa(i,x)));
return fa(i,x);
}
inline void un(int i,int x,int y){
x=getroot(i,x);
y=getroot(i,y);
if(x==y)return;
rp[i]->replace(x,y);
}
int main(){
n=rd(),m=rd();
for(int i=1; i<=n; i++)a[i]=i;
rp[0]=new rope<int>(a,a+n+1);
int i=0;
while(m--){
i++;
rp[i]=new rope<int>(*rp[i-1]);
int x=rd(),y,z;
if(x==1)y=rd(),z=rd(),un(i,y,z);
else if(x==2)y=rd(),rp[i]=new rope<int>(*rp[y]);
else y=rd(),z=rd(),printf("%d\n",getroot(i,y)==getroot(i,z));
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务