1 条题解

  • 0
    @ 2026-1-11 16:34:50
    #include<bits/stdc++.h>
    #define int ll
    #define fa(p) tr[p].fa
    #define lc(p) tr[p].ch[0]
    #define rc(p) tr[p].ch[1]
    #define nr(p) lc(fa(p))==p||rc(fa(p))==p
    using namespace std;
    typedef long long ll;
    const int mod=51061;
    int n,q;
    struct N{
    	int ch[2],fa,v,s,la,la2,lav,sz;
    }tr[300010];
    inline int max(int a,int b){
    	return a>b?a:b;
    }
    void pushup(int p){
    	tr[p].sz=tr[lc(p)].sz+tr[rc(p)].sz+1;
    	tr[p].s=(tr[lc(p)].s+tr[rc(p)].s+tr[p].v)%mod;
    }
    void pushdown(int p){
    	if(tr[p].la!=1){
    		if(lc(p)){
    			tr[lc(p)].v=tr[lc(p)].v*tr[p].la%mod;
    			tr[lc(p)].s=tr[lc(p)].s*tr[p].la%mod;
    			tr[lc(p)].la=tr[lc(p)].la*tr[p].la%mod;
    			tr[lc(p)].la2=tr[lc(p)].la2*tr[p].la%mod;
    		}
    		if(rc(p)){
    			tr[rc(p)].v=tr[rc(p)].v*tr[p].la%mod;
    			tr[rc(p)].s=tr[rc(p)].s*tr[p].la%mod;
    			tr[rc(p)].la=tr[rc(p)].la*tr[p].la%mod;
    			tr[rc(p)].la2=tr[rc(p)].la2*tr[p].la%mod;
    		}
    		tr[p].la=1;
    	}
    	if(tr[p].la2){
    		if(lc(p)){
    			tr[lc(p)].v=(tr[lc(p)].v+tr[p].la2)%mod;
    			tr[lc(p)].s=(tr[lc(p)].s+tr[p].la2*tr[lc(p)].sz)%mod;
    			tr[lc(p)].la2=(tr[lc(p)].la2+tr[p].la2)%mod;
    		}
    		if(rc(p)){
    			tr[rc(p)].v=(tr[rc(p)].v+tr[p].la2)%mod;
    			tr[rc(p)].s=(tr[rc(p)].s+tr[p].la2*tr[rc(p)].sz)%mod;
    			tr[rc(p)].la2=(tr[rc(p)].la2+tr[p].la2)%mod;
    		}
    		tr[p].la2=0;
    	}
    	if(tr[p].lav){
    		swap(lc(p),rc(p));
    		tr[lc(p)].lav^=1;
    		tr[rc(p)].lav^=1;
    		tr[p].lav=0;
    	}
    }
    void rotate(int x){
    	int y=fa(x),z=fa(y),k=rc(y)==x;
    	if(nr(y))tr[z].ch[rc(z)==y]=x;fa(x)=z;
    	tr[y].ch[k]=tr[x].ch[k^1];fa(tr[x].ch[k^1])=y;
    	tr[x].ch[k^1]=y;fa(y)=x;
    	pushup(y);pushup(x);
    }
    void pushall(int x){
    	if(nr(x))pushall(fa(x));
    	pushdown(x);
    }
    void splay(int x){
    	pushall(x);
    	while(nr(x)){
    		int y=fa(x),z=fa(y);
    		if(nr(y))((rc(y)==x)^(rc(z)==y))?rotate(x):rotate(y);
    		rotate(x);
    	}
    }
    void access(int x){
    	for(int y=0;x;){
    		splay(x);
    		rc(x)=y;
    		pushup(x);
    		y=x;x=fa(x);
    	} 
    }
    void mkrt(int x){
    	access(x);
    	splay(x);
    	tr[x].lav^=1;
    }
    int fdrt(int x){
    	access(x);
    	splay(x);
    	while(lc(x))pushdown(x),x=lc(x);
    	splay(x);
    	return x;
    }
    void pr(int x,int y){
    	mkrt(x);
    	access(y);
    	splay(y);
    	cout<<tr[y].s<<'\n';
    } 
    void c1(int x,int y,int v){
    	mkrt(x);
    	access(y);
    	splay(y);
    	tr[y].v=tr[y].v*v%mod;
    	tr[y].s=tr[y].s*v%mod;
    	tr[y].la=tr[y].la*v%mod;
    	tr[y].la2=tr[y].la2*v%mod; 
    } 
    void c2(int x,int y,int v){
    	mkrt(x);
    	access(y);
    	splay(y);
    	tr[y].v=(tr[y].v+v)%mod;
    	tr[y].s=(tr[y].s+v*tr[y].sz)%mod;
    	tr[y].la2=(tr[y].la2+v)%mod; 
    } 
    
    void link(int x,int y){
    	mkrt(x);
    	if(fdrt(y)!=x)fa(x)=y;
    }
    void cut(int x,int y){
    	mkrt(x);
    	if(fdrt(y)==x&&fa(y)==x&&!lc(y)){
    		fa(y)=0;
    		pushup(x);
    	}
    } 
    signed main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin>>n>>q;
    	for(int i=1;i<=n;i++){
    		tr[i].v=tr[i].s=1;
    		tr[i].la=tr[i].sz=1;
    	}
    	for(int i=1,x,y;i<n;i++){
    		cin>>x>>y;
    		link(x,y);
    	}
    	for(int i=1;i<=n;i++)splay(i); 
    	while(q--){
    		char op;
    		int x,y;
    		cin>>op;
    		if(op=='+'){
    			int x,y,v;
    			cin>>x>>y>>v;
    			c2(x,y,v);
    		}
    		else if(op=='*'){
    			int x,y,v;
    			cin>>x>>y>>v;
    			c1(x,y,v); 
    		}
    		else if(op=='-'){
    			int x1,y1,x2,y2;
    			cin>>x1>>y1>>x2>>y2;
    			cut(x1,y1);
    			link(x2,y2);
    		}
    		else{
    			int x,y;
    			cin>>x>>y;
    			pr(x,y);
    		}
    	}
    	return 0;
    } 
    
    • 1

    *【动态树 LCT】动态树入门4️⃣[国家集训队] Tree II

    信息

    ID
    4296
    时间
    2000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    26
    已通过
    7
    上传者