社区讨论

死循环求条

P3690【模板】动态树(LCT)参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mknerzir
此快照首次捕获于
2026/01/21 10:33
4 周前
此快照最后确认于
2026/01/24 16:20
4 周前
查看原帖
代码过于抽象,求条。
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+5; 
struct LCT{//link-cut tree
	struct nd{
		int fa,son[2];
		int sum,val,tag,swp;
		int sz;
	}a[N];
	#define ls son[0]
	#define rs son[1]
	void pu(int p){
		a[p].sum=a[a[p].ls].sum^a[a[p].rs].sum^a[p].val;
		a[p].sz=a[a[p].ls].sz+a[a[p].rs].sz;
	}
	void pd(int p){
		if(a[p].swp){
			a[p].swp=0;
			swap(a[p].ls,a[p].rs);
			if(a[p].ls)a[a[p].ls].swp^=1; 
			if(a[p].rs)a[a[p].rs].swp^=1; 
		}
	}
	void pa(int p){
		if(get(p)>=0){
			pa(a[p].fa); 
		}
		pd(p);
	}
	int get(int p){
		static int fa;
		fa=a[p].fa;
		if(a[fa].ls==p)return 0;
		if(a[fa].rs==p)return 1;
		return -1;
	}
	//
	void rot(int u){
		int fa=a[u].fa;
		int ffa=a[fa].fa;
		int rf=get(fa),r=get(u);
		if(ffa)a[ffa].son[rf]=u;
		else;
		a[u].fa=ffa;		
		a[fa].son[r]=a[fa].son[r^1];
		a[a[fa].son[r^1]].fa=fa;
		a[fa].fa=u;
		a[u].son[r^1]=fa;
		pu(fa);pu(u);
	}
	void Sp(int u){		
		int fa,ffa;
		pa(u);
		while(get(u)>=0){
			fa=a[u].fa,ffa=a[fa].fa;
			if(ffa==0){
				rot(u);
				break;
			}
			if(get(fa)==get(u))rot(fa);
			else rot(u);
			rot(u);
		}
	}
	int A(int u){//access
		int v;
		for(v=0;u;v=u,u=a[u].fa){
			Sp(u);
			a[u].rs=v;
			pu(u);
		}
		return v;
	}
	void mkRT(int p){
		p=A(p);
		a[p].swp^=1;
		pd(p);
	}
	int findf(int u){
		u=A(u);
		//Splay(u);
		while(a[u].ls)pd(u),u=a[u].ls;
		Sp(u);
		return u;
	}	
	bool lnk(int u,int v){
		mkRT(u);
		if(findf(v)==u)return 0;
		Sp(u);
		a[u].fa=v;
		return 1;
	}
	//
	void S(int u,int v){
		mkRT(u);
		A(v);
		Sp(v);
	}
	bool cut(int u,int v){
		if(findf(v)!=findf(u))return 0;
		S(u,v);
		if(a[u].fa!=v||a[u].sz>2)return 0;
		a[u].fa=a[v].ls=0;
		pu(u);
		return 1;
	}	
	void mkt();
}t;
int n,q;
int op,u,v;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>q;
	for(int i=1,a;i<=n;i++){
		cin>>a;
		t.a[i].sum=t.a[i].val=a;
	}
	while(q--){
		cin>>op>>u>>v;
		if(op==0){
			t.S(u,v);
			cout<<t.a[v].sum<<'\n';
		}else if(op==1){
			t.lnk(u,v);
		}else if(op==2){
			t.cut(u,v);
		}else{
			t.Sp(u);
			t.a[u].val=v;
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...