首页 > 代码库 > AC日记——【模板】Link Cut Tree 洛谷 P3690
AC日记——【模板】Link Cut Tree 洛谷 P3690
【模板】Link Cut Tree
思路:
LCT模板;
代码:
#include <bits/stdc++.h>using namespace std;#define maxn 300005int n,m,val[maxn];int top,ch[maxn][2],f[maxn],xr[maxn],q[maxn],rev[maxn];inline void in(int &now){ int if_z=1;now=0; char Cget=getchar(); while(Cget>‘9‘||Cget<‘0‘) { if(Cget==‘-‘) if_z=-1; Cget=getchar(); } while(Cget>=‘0‘&&Cget<=‘9‘) { now=now*10+Cget-‘0‘; Cget=getchar(); } now*=if_z;}inline void updata(int now){ xr[now]=xr[ch[now][0]]^xr[ch[now][1]]^val[now];}inline void downdata(int now){ int l=ch[now][0],r=ch[now][1]; if(rev[now]) { rev[l]^=1,rev[r]^=1,rev[now]^=1; swap(ch[now][0],ch[now][1]); }}inline bool isroot(int now){ return ch[f[now]][0]!=now&&ch[f[now]][1]!=now;}inline void rotate(int now){ int fa=f[now],ffa=f[fa],l,r; if(ch[fa][0]==now) l=0;else l=1;r=l^1; if(!isroot(fa)) { if(ch[ffa][0]==fa) ch[ffa][0]=now; else ch[ffa][1]=now; } f[now]=ffa,f[fa]=now,f[ch[now][r]]=fa; ch[fa][l]=ch[now][r],ch[now][r]=fa; updata(fa),updata(now);}inline void splay(int now){ top=1,q[top]=now; for(int i=now;!isroot(i);i=f[i]) q[++top]=f[i]; for(int i=top;i;i--) downdata(q[i]); while(!isroot(now)) { int fa=f[now],ffa=f[fa]; if(!isroot(fa)) { if((ch[fa][0]==now)^(ch[ffa][0]==fa)) rotate(now); else rotate(fa); } rotate(now); }}void access(int now){ for(int t=0;now;t=now,now=f[now]) { splay(now); ch[now][1]=t; updata(now); }}void makeroot(int now){ access(now); splay(now); rev[now]^=1;}int find(int now){ access(now); splay(now); while(ch[now][0]) now=ch[now][0]; return now;}void split(int x,int y){ makeroot(x); access(y); splay(y);}void cut(int x,int y){ split(x,y); if(ch[y][0]==x) ch[y][0]=0,f[x]=0;}void link(int x,int y){ makeroot(x); f[x]=y;}int main(){ in(n),in(m);int op,x,y,xx,yy; for(int i=1;i<=n;i++) in(val[i]),xr[i]=val[i]; while(m--) { in(op); if(op==0) { in(x),in(y),split(x,y); printf("%d\n",xr[y]); } if(op==1) { in(x),in(y),xx=find(x),yy=find(y); if(xx!=yy) link(x,y); } if(op==2) { in(x),in(y),xx=find(x),yy=find(y); if(xx==yy) cut(x,y); } if(op==3) { in(x),in(y); access(x); splay(x); val[x]=y; updata(x); } }}
AC日记——【模板】Link Cut Tree 洛谷 P3690
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。