1 条题解
-
0
#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
信息
- ID
- 4296
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 26
- 已通过
- 7
- 上传者