您的位置:首页 > 其它

bzoj 3673: 可持久化并查集 by zky

2017-12-01 20:03 169 查看
题目链接

【想说的话】

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: