LCT板子TLE求调
查看原帖
LCT板子TLE求调
419144
luckydrawbox楼主2023/8/5 19:56

RT,只 A 了 #10 #12 #13 3个点

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch))
	{if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=3e5+10;
int n,m;
#define pl a[p].ch[0]
#define pr a[p].ch[1]
struct LCT{
	struct Tree{
		int ch[2],fa;
		int val,sum,rev;
	}a[N];
	bool isroot(int p){
		return a[a[p].fa].ch[0]!=p&&a[a[p].fa].ch[1]!=p;
	}
	void pushup(int p){
		a[p].sum=a[pl].sum^a[p].val^a[pr].sum;
	}
	void pushrev(int p){
		swap(pl,pr);a[p].rev^=1;
	}
	void pushdown(int p){
		if(a[p].rev){
			if(pl)pushrev(pl);
			if(pr)pushrev(pr);
			a[p].rev=0;
		}
	}
	int get(int p){
		return a[a[p].fa].ch[1]==p;
	}
	void update(int p){
		if(!isroot(p))update(a[p].fa);
		pushdown(p);
	}
	void rotate(int p){
		int fp=a[p].fa,ffp=a[fp].fa;
		int ty=get(p);
		if(!isroot(fp))a[ffp].ch[get(fp)]=p;a[p].fa=ffp;
		a[fp].ch[ty]=a[p].ch[ty^1];
		if(a[p].ch[ty^1])a[a[p].ch[ty^1]].fa=fp;
		a[p].ch[ty^1]=fp;a[fp].fa=p;
		pushup(fp);pushup(p);
	}
	void splay(int p){
		update(p);
		for(int fp=a[p].fa;!isroot(p);rotate(p))
		if(!isroot(fp))rotate(get(fp)^get(p)?p:fp);
		pushup(p);
	}
	void access(int p){
		for(int q=0;p;p=a[q=p].fa)
			splay(p),pr=q,pushup(p);
	}
	void makeroot(int p){
		access(p);splay(p);pushrev(p);
	}
	int findroot(int p){
		access(p);splay(p);
		while(pl)pushdown(p),p=pl;
		splay(p);return p;
	}
	void split(int p,int q){
		makeroot(p);access(q);splay(q);
	}
	void link(int p,int q){
		makeroot(p);if(p!=findroot(q))a[p].fa=q;
	}
	void cut(int p,int q){
		makeroot(p);
		if(findroot(q)==p&&a[q].fa==p&&!a[q].ch[0]){
			a[q].fa=pr=0;
			pushup(p);
		}
	}
}lct;
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++){
		lct.a[i].val=lct.a[i].sum=read();
	}
	while(m--){
		int op=read(),x=read(),y=read();
		switch(op){
			case 0:lct.split(x,y);write(lct.a[y].sum);puts("");break;
			case 1:lct.link(x,y);break;
			case 2:lct.cut(x,y);break;
			case 3:lct.splay(x);lct.a[x].val=y;lct.pushup(x);break;
		}
	}
	return 0;
}
2023/8/5 19:56
加载中...