LCT模板题求调
查看原帖
LCT模板题求调
285617
黑影洞人楼主2023/10/5 00:36
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 114514
using namespace std;
int T;
int n,m;
struct link_cut_tree{
	int ch[N][2],st[N],f[N],siz[N],ans[N],lco[N],rco[N],val[N],tag[N];
	bool r[N];
	#define lc ch[x][0]
	#define rc ch[x][1]
	void clear(){
		memset(siz,0,sizeof(siz));
		memset(ch,0,sizeof(ch));
		memset(f,0,sizeof(f));
		memset(ans,0,sizeof(ans));
		memset(lco,0,sizeof(lco));
		memset(rco,0,sizeof(rco));
		memset(val,0,sizeof(val));
		memset(tag,0,sizeof(tag));
		memset(r,0,sizeof(r));
	}
	void rev(int x){r[x]^=1;swap(lc,rc);}
	int son(int x){return x==ch[f[x]][1];}
	int nroot(int x){return x==ch[f[x]][0]||x==ch[f[x]][1];}
	void pushup(int x){
		siz[x]=(lc?siz[lc]:0)+(rc?siz[rc]:0)+1;
		ans[x]=(lc?ans[lc]:0)+(rc?ans[rc]:0);
		lco[x]=lc?lco[lc]:val[x];
		rco[x]=rc?rco[rc]:val[x];
		if(rc&&rco[lc]==val[x]&&val[x])ans[x]++;
		if(lc&&lco[rc]==val[x]&&val[x])ans[x]++;
	}
	void assign(int x,int v){
		ans[x]=siz[x]-1;
		tag[x]=v,val[x]=v;
		lco[x]=v,rco[x]=v;
	}
	void pushdown(int x){
		if(r[x]){
			if(lc)rev(lc);
			if(rc)rev(rc);
			r[x]=0;
		}
		if(tag[x]){
			if(lc)assign(lc,tag[x]);
			if(rc)assign(rc,tag[x]);
			tag[x]=0;
		}
	}
	void rotate(int x){
		int y=f[x],z=f[y],k=son(x),w=ch[x][!k];
		if(nroot(y))ch[z][son(y)]=x;
		ch[x][!k]=y,ch[y][k]=w;
		if(w)f[w]=y;
		f[x]=z,f[y]=x;
		pushup(y);
	}
	void splay(int x){
		int y=x,z=0;
		st[++z]=y;
		while(nroot(y))st[++z]=y=f[y];
		while(z)pushdown(st[z--]);
		while(nroot(x)){
			y=f[x];
			if(nroot(y))rotate(son(x)!=son(y)?x:y);
			rotate(x);
		}
		pushup(x);
	}
	void access(int x){for(int y=0;x;x=f[y=x])splay(x),rc=y,pushup(x);}
	void makeroot(int x){access(x),splay(x),rev(x);}
	void split(int x,int y){makeroot(x),access(y),splay(y);}
	void link(int x,int y){makeroot(x),f[x]=y;}
	void print(int x){
		//pushdown(x);
		if(lc)print(lc);
		printf("%d ",ans[x]);
		if(rc)print(rc);
	}
}lct;
signed main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		lct.clear();
		for(int i=1;i<n;i++){
			int u,v;
			scanf("%d%d",&u,&v);
			lct.link(u,v);
		}
		for(int i=1;i<=n;i++)lct.val[i]=i,lct.lco[i]=lct.rco[i]=i;
		int col=n;
		while(m--){
			int op,x,y;
			scanf("%d%d%d",&op,&x,&y);
			lct.split(x,y);
			if(op==1)lct.assign(y,++col);
			else printf("%d\n",lct.ans[y]);
		//	lct.split(x,y);
		//	lct.print(y);
		//	puts("");
		}
	}
	return 0;
}



2023/10/5 00:36
加载中...