MnZn求调动态树模板
查看原帖
MnZn求调动态树模板
285617
黑影洞人楼主2022/8/23 14:03
#include<cstdio>
#include<algorithm>
#include<map>
#define N 1919810
using namespace std;
int n,q;
map<pair<int,int>,int>mp;
struct link_cut_tree{
	int ch[N][2],f[N],val[N],mx[N],tg1[N],tg2[N],st[N];
	bool r[N];
	#define lc ch[x][0]
	#define rc ch[x][1]
	void rev(int x){swap(lc,rc),r[x]^=1;}
	void pushup(int x){mx[x]=max(max(mx[lc],mx[rc]),val[x]);}
	void assign(int x,int y){
		if(x<=n)return;
		val[x]=y,mx[x]=y,tg1[x]=y,tg2[x]=0;
	}
	void add(int x,int y){
		if(x<=n)return;
		val[x]+=y,mx[x]+=y,tg2[x]+=y;
	}
	int son(int x){return ch[f[x]][1]==x;}
	int nroot(int x){return ch[f[x]][0]==x||ch[f[x]][1]==x;}
	void pushdown(int x){
		if(tg1[x])if(lc)assign(lc,tg1[x]);
		if(tg1[x])if(rc)assign(rc,tg1[x]);
		if(tg2[x])if(lc)add(lc,tg2[x]);
		if(tg2[x])if(rc)add(rc,tg2[x]);
		tg1[x]=tg2[x]=0;
		if(r[x]){
			if(lc)rev(lc);
			if(rc)rev(rc);
			r[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(y);access(x);splay(x);}
	void link(int x,int y){split(x,y);f[y]=x;}
}lct;
signed main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		lct.val[i+n]=lct.mx[i+n]=c;
		lct.link(i+n,a);
		lct.link(i+n,b);
	}
	char s[19];
	while(scanf("%s",s)){
		if(s[0]=='S')break;
		int a,b,c;
		scanf("%d%d",&a,&b);
		if(s[1]=='o'){//cover
			scanf("%d",&c);
			lct.split(a,b);
			lct.assign(a,c);
		}else if(s[0]=='C'){//change
			lct.access(n+a);lct.splay(n+a);
			lct.val[n+a]=b; 
		}else if(s[0]=='M'){//max
			lct.split(a,b);
			printf("%d\n",lct.mx[a]);
		}else{//add
			scanf("%d",&c);
			lct.split(a,b);
			lct.add(a,c);
		}
	}
	return 0;
}



2022/8/23 14:03
加载中...