MnZn求助LCT
查看原帖
MnZn求助LCT
287355
1lgorithm楼主2021/7/19 11:39

91pts,第九个点WA

代码:

#include<iostream>
using namespace std;
#define ll long long
const ll N=3e5+5;
ll n,m,val[N];
struct LCT{
	ll top,son[N][2],Xor[N],fa[N],rev[N],sta[N];
	void pushup(int x){
		Xor[x]=Xor[son[x][0]]^Xor[son[x][1]]^val[x];
	}
	void pushdown(int x){
		int l=son[x][0],r=son[x][1];
		if(rev[x]){
			rev[l]^=1,rev[r]^=1,rev[x]^=1;
			swap(son[x][0],son[x][1]);
		}
	}
	bool isroot(int x){
		return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
	}
	void rotate(int x){
		int y=fa[x],z=fa[y],l,r;
		if(son[y][0]==x) l=0;
		else l=1;
		r=l^1;
		if(!isroot(y)){
			if(son[z][0]==y) son[z][0]=x;
			else son[z][1]=x;
		}
		fa[x]=z,fa[y]=x,fa[son[x][r]]=y;
		son[y][l]=son[x][r];son[x][r]=y;
		pushup(y);pushup(x);
	}
	void splay(int x){
		top=0;
		sta[++top]=x;
		for(int i=x;!isroot(i);i=fa[i]) sta[++top]=fa[i];
		for(int i=top;i;--i) pushdown(sta[i]);
		while(isroot(x)==0){
			int y=fa[x],z=fa[y];
			if(!isroot(y)){
				if((son[y][0]==x)^(son[z][0]==y)) rotate(x);
				else rotate(y);
			}
			rotate(x);
		}
	}
	void acc(int x){
		for(int t=0;x;t=x,x=fa[x]){
			splay(x);
			son[x][1]=t;
			pushup(x);
		}
	}
	void makeroot(int x){
		acc(x);
		splay(x);
		rev[x]^=1;
	}
	int find(int x){
		acc(x);
		splay(x);
		pushdown(x);
		while(son[x][0]) pushdown(x),x=son[x][0];
		splay(x);
		return x;
	}
	void split(int x,int y){
		makeroot(x);
		acc(y);
		splay(y);
	}
	void link(int x,int y){
		makeroot(x);
		fa[x]=y;
	}
	void cut(int x,int y){
		makeroot(x);
		if(son[y][0]==x&&!son[x][1]) son[y][0]=0,fa[x]=0,pushup(y);
	}
};
LCT T;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>val[i],T.Xor[i]=val[i];
	while(m--){
		int opt;
		cin>>opt;
		if(opt==0){
			int x,y;
			cin>>x>>y;
			T.split(x,y);
			cout<<T.Xor[y]<<endl;
		}
		if(opt==1){
			int x,y;
			cin>>x>>y;
			int X=T.find(x),Y=T.find(y);
			if(X!=Y) T.link(x,y);
		}
		if(opt==2){
			int x,y;
			cin>>x>>y;
			int X=T.find(x),Y=T.find(y);
			if(X!=Y) T.cut(x,y);
		}
		if(opt==3){
			int x,y;
			cin>>x>>y;
			T.acc(x);T.splay(x);val[x]=y; 
			T.pushup(x);
		}
	}
}
2021/7/19 11:39
加载中...