萌新求助LCT
查看原帖
萌新求助LCT
200044
JS_TZ_ZHR楼主2021/1/8 23:39

RT,样例二WA了

#include<bits/stdc++.h>
#define N 1000005
#define isroot(p) (s[f[p]][0]!=p&&s[f[p]][1]!=p)
#define get(p) (p==s[f[p]][1])
using namespace std;
int n,m;
struct Link_Cut_Tree {
	int f[N],s[N][2],Xor[N],tag[N],a[N];
	void push_up(int p) {
		Xor[p]=Xor[s[p][0]]^Xor[s[p][1]]^a[p];
	}
	void upd1(int p) {
		tag[p]^=1;
		swap(s[p][0],s[p][1]);
	}
	void push_down(int p) {
		if(tag[p]) {
			if(s[p][0])upd1(s[p][0]);
			if(s[p][1])upd1(s[p][1]);
			tag[p]=0;
		}
	}
	void upd2(int p) {
		if(!isroot(p))upd2(f[p]);
		push_down(p);
	}
	void spin(int x) {
		int y=f[x],z=f[f[x]],opt=get(x);
		if(!isroot(y))s[z][get(y)]=x;
		s[y][opt]=s[x][opt^1],f[s[x][opt^1]]=y;
		s[x][opt^1]=y,f[y]=x,f[x]=z;
		push_up(x),push_up(y);
	}
	void splay(int p) {
		upd2(p);
		for(int fa; fa=f[p],!isroot(p); spin(p))
			if(!isroot(fa))spin(get(p)==get(fa)?fa:p);
	}
	int access(int x) {
		int p;
		for(p=0; x; p=x,x=f[x])
			splay(x),s[x][1]=p,push_up(x);
		return p;
	}
	void makeroot(int p) {
		access(p);
		splay(p);
		upd1(p);
	}
	int find(int p) {
		access(p),splay(p);
		while(s[p][0])push_down(p),p=s[p][0];
		splay(p);
		return p;
	}
	void link(int x,int y) {
		makeroot(x);
		if(find(y)!=x)f[x]=y;
	}
	void cut(int x,int y) {
		makeroot(x);
		if(find(y)==x&&f[y]==x&&!s[y][0]){
			f[y]=s[x][1]=0;
			push_up(x);
		}
	}
	void spilt(int x,int y){
		makeroot(x),access(y),splay(y);
	}
} t;
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&t.a[i]);
	int opt,x,y;
	while(m--){
		scanf("%d%d%d",&opt,&x,&y);
		if(opt==0)t.spilt(x,y),printf("%d\n",t.Xor[y]);
		if(opt==1)t.link(x,y);
		if(opt==2)t.cut(x,y);
		if(opt==3)t.splay(x),t.a[x]=y;
	}
}
2021/1/8 23:39
加载中...