3673/3674: 可持久化并查集加强版

来源:互联网 发布:中科大软件学院 编辑:程序博客网 时间:2024/06/08 10:51

题目链接

题目大意:可持久化并查集,强制在线

题解:可持久化线段树+启发式合并
rope强啊

我的收获:

#include<cstdio>#include<ext/rope>using namespace __gnu_cxx;rope<int> *fa[200002];int n,m,i,x,y,p,ans,a[200002];int find(int x){    if(fa[i]->at(x)!=x){        int f=find(fa[i]->at(x));        if(f==fa[i]->at(x))return f;        fa[i]->replace(x,f);        return fa[i]->at(x);    }    return x;}void uni(int x,int y){int p=find(x),q=find(y);fa[i]->replace(q,p);}int main(){    scanf("%d%d",&n,&m);for(i=0;i<=n;i++)a[i]=i;    fa[0]=new rope<int>(a,a+n+1);    for(i=1;i<=m;i++){        fa[i]=new rope<int>(*fa[i-1]);scanf("%d",&p);        if(p==1)scanf("%d%d",&x,&y),uni(x^ans,y^ans);        else if(p==2)scanf("%d",&x),fa[i]=fa[x^ans];        else if(p==3)scanf("%d%d",&x,&y),printf("%d\n",(ans=find(x^ans)==find(y^ans)));    }}
阅读全文
0 0