【bzoj2631】tree LCT
来源:互联网 发布:人工智能机器2氏族战争 编辑:程序博客网 时间:2024/06/13 06:50
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2631
【题解】
参考黄学长的代码,学到了同时传递加法和乘法标记的方法。
注意如果在传递乘法标记的同时传递了加法标记,那么加法标记也要乘上这个数。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>using namespace std;typedef unsigned int ll;#define FILE "read"#define MAXN 100010#define up(i,j,n) for(ll i=j;i<=n;++i)#define dn(i,j,n) for(ll i=j;i>=n;--i)#define cmax(a,b) a=max(a,b)#define cmin(a,b) a=min(a,b)const ll mod=51061;ll n,m;inline int read(){int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}return x*f;}namespace Link_Cut_Tree{ll top,f[MAXN],sum[MAXN],v[MAXN],vis[MAXN],size[MAXN],stack[MAXN],delta[MAXN],deltm[MAXN],son[MAXN][2];bool get(ll x){return son[f[x]][1]==x;}bool isroot(ll x){return f[x]==0||son[f[x]][0]!=x&&son[f[x]][1]!=x;}void updata(ll x){size[x]=(size[son[x][0]]+size[son[x][1]]+1)%mod;sum[x]=(sum[son[x][0]]+sum[son[x][1]]+v[x])%mod;}void cal(ll x,ll m,ll a){v[x]=(v[x]*m+a)%mod;sum[x]=(sum[x]*m+size[x]*a)%mod;delta[x]=(delta[x]*m+a)%mod;deltm[x]=(deltm[x]*m)%mod;}void pushdown(ll x){if(vis[x]){swap(son[x][0],son[x][1]);vis[son[x][0]]^=1; vis[son[x][1]]^=1; vis[x]=0;}if(delta[x]!=0||deltm[x]!=1){cal(son[x][0],deltm[x],delta[x]); cal(son[x][1],deltm[x],delta[x]);delta[x]=0; deltm[x]=1;}}void rotate(ll x){ll y=f[x],z=f[y],which=get(x);if(!isroot(y)) son[z][son[z][1]==y]=x;son[y][which]=son[x][which^1]; f[son[y][which]]=y;son[x][which^1]=y; f[y]=x; f[x]=z;updata(y); updata(x);}void splay(ll x){stack[++top]=x;for(ll i=x;!isroot(i);i=f[i]) stack[++top]=f[i];while(top) pushdown(stack[top--]);for(ll y=f[x];!isroot(x);rotate(x),y=f[x])if(!isroot(y)) rotate(get(x)==get(y)?y:x);}void access(ll x){for(ll temp(0);x;temp=x,x=f[x])splay(x),son[x][1]=temp,updata(x);}void reverse(ll x){access(x);splay(x);vis[x]^=1;}void linkk(ll x,ll y){reverse(x);f[x]=y;}void split(ll x,ll y){reverse(x);access(y);splay(y);}void cut(ll x,ll y){split(x,y);son[y][0]=f[x]=0;}}int main(){freopen(FILE".in","r",stdin);freopen(FILE".out","w",stdout);using namespace Link_Cut_Tree;n=read(); m=read();up(i,1,n) v[i]=sum[i]=size[i]=deltm[i]=1;up(i,1,n-1) {ll x=read(),y=read(); linkk(x,y);}up(i,1,m){char ch[2]; scanf("%s",ch); ll x=read(),y=read();if(ch[0]=='+') {ll c=read();split(x,y);cal(y,1,c);}else if(ch[0]=='-') {cut(x,y);x=read();y=read();linkk(x,y);}else if(ch[0]=='*') {ll m=read();split(x,y);cal(y,m,0);}else {split(x,y);printf("%d\n",sum[y]);}}return 0;}
1 0
- bzoj2631: tree LCT
- 【bzoj2631】【tree】【lct】
- [BZOJ2631]tree(LCT)
- Bzoj2631:tree(伍一鸣):LCT
- 【bzoj2631】tree LCT
- [BZOJ2631][Tree][LCT]
- BZOJ2631:tree(LCT)
- [BZOJ2631]tree(LCT)
- 【lct模板】bzoj2631: tree
- BZOJ2631【LCT】
- bzoj2631 -- LCT
- bzoj2631(lct)
- bzoj2631 tree
- bzoj2631: tree
- 【BZOJ2631】tree
- bzoj2631 tree
- [BZOJ2631] tree
- [BZOJ2631]tree
- 查看远端的端口是否通畅3个简单实用案例!
- java的HMACSHA1加密算法使用方法
- 在js中=后面赋值出现||符号
- C++调用Python实例
- 监督学习-树回归模板
- 【bzoj2631】tree LCT
- 图像标注工具
- C++单例模式使用
- 格式化EXT中的 UTC 时间
- Javascript 中 apply、call、bind
- oracle数据库密码到期解决
- instanceof 运算符
- git打patch的方法
- Linux Rename命令用法