
版权声明:本文为博主原创文章,想转载告诉QQ851627835一下就好。 https://blog.csdn.net/everlasting_20141622/article/details/78691737
→题目链接←
【想说的话】
rope大法好*2
【题解】
和我的上一篇没有什么区别
需要注意的是 xor 和 MLE 问题
MLE的解决办法是路径压缩时如果可以不更新就不更新
我第一次知道这种东西可以这么缩内存....
【代码】
#include<bits/stdc++.h> #include<ext/rope> #define MAXN 200020 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; int f=getroot(i,fa(i,x)); if(fa(i,x)!=f)rp[i]->replace(x,f); return f; } 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,lastans=0; while(m--){ i++; rp[i]=new rope<int>(*rp[i-1]); int x=rd(),y,z; if(x==1)y=rd()^lastans,z=rd()^lastans,un(i,y,z); else if(x==2)y=rd()^lastans,rp[i]=new rope<int>(*rp[y]); else y=rd()^lastans,z=rd()^lastans,printf("%d\n",lastans=getroot(i,y)==getroot(i,z)?1:0); } return 0; }