bzoj 2631 tree
来源:互联网 发布:淘宝店铺动态怎么写 编辑:程序博客网 时间:2024/06/05 03:44
2631: tree
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 4429 Solved: 1488
[Submit][Status][Discuss]
Description
一棵n个点的树,每个点的初始权值为1。对于这棵树有q个操作,每个操作为以下四种操作之一:
+ u v c:将u到v的路径上的点的权值都加上自然数c;
- u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树;
* u v c:将u到v的路径上的点的权值都乘上自然数c;
/ u v:询问u到v的路径上的点的权值和,求出答案对于51061的余数。
Input
第一行两个整数n,q
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作
Output
对于每个/对应的答案输出一行
Sample Input
3 2
1 2
2 3
* 1 3 4
/ 1 1
1 2
2 3
* 1 3 4
/ 1 1
Sample Output
4
HINT
数据规模和约定
10%的数据保证,1<=n,q<=2000
另外15%的数据保证,1<=n,q<=5*10^4,没有-操作,并且初始树为一条链
另外35%的数据保证,1<=n,q<=5*10^4,没有-操作
100%的数据保证,1<=n,q<=10^5,0<=c<=10^4
Source
【分析】
一种想rigel的冲动...
唉pushdown的时候乘法标记写成 if(mul>1) 再操作了...殊不知还有mul==0的情况23333
改的天昏地暗...终于在二分提交中试出了错误...
【代码】
//bzoj 2631 Tree#include<iostream>#include<cstring>#include<cstdio>#define p 51061#define ll unsigned int#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=100005;char s[2];int n,m,top;int f[mxn],ch[mxn][2],st[mxn],size[mxn];ll sum[mxn],add[mxn],mul[mxn],rev[mxn],key[mxn];inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return x*f;}inline bool isroot(int x){ return (ch[f[x]][0]!=x && ch[f[x]][1]!=x);}inline int get(int x){ if(ch[f[x]][0]==x) return 0;return 1;}inline void update(int x){ size[x]=size[ch[x][0]]+size[ch[x][1]]+1; sum[x]=(sum[ch[x][0]]+sum[ch[x][1]]+key[x])%p;}inline void ope_mul(int x,ll mu){ add[x]=add[x]*mu%p; mul[x]=mul[x]*mu%p; key[x]=key[x]*mu%p; sum[x]=sum[x]*mu%p;}inline void ope_add(int x,ll c){ add[x]=(add[x]+c)%p; key[x]=(key[x]+c)%p; sum[x]=(sum[x]+c*size[x]%p)%p;}inline void pushdown(int x){ if(rev[x]) { rev[ch[x][0]]^=1,rev[ch[x][1]]^=1; swap(ch[x][0],ch[x][1]); } if(mul[x]!=1) { if(ch[x][0]) ope_mul(ch[x][0],mul[x]); if(ch[x][1]) ope_mul(ch[x][1],mul[x]); } if(add[x]) { if(ch[x][0]) ope_add(ch[x][0],add[x]); if(ch[x][1]) ope_add(ch[x][1],add[x]); } update(x); rev[x]=add[x]=0,mul[x]=1;}inline void rotate(int x) //{ pushdown(x); int fa=f[x],fafa=f[fa],which=get(x); if(!isroot(fa)) ch[fafa][ch[fafa][1]==fa]=x; f[x]=fafa; ch[fa][which]=ch[x][which^1],f[ch[fa][which]]=fa; ch[x][which^1]=fa,f[fa]=x; update(fa),update(x);}inline void splay(int x) //{ st[top=1]=x; for(int i=x;!isroot(i);i=f[i]) st[++top]=f[i]; for(int i=top;i;i--) pushdown(st[i]); for(int fa;!isroot(x);rotate(x)) if(!isroot(fa=f[x])) rotate(get(x)==get(fa)?fa:x);}inline void access(int x) //{ for(int y=0;x;y=x,x=f[x]) splay(x),ch[x][1]=y;} inline void makeroot(int x) //{ access(x),splay(x),rev[x]^=1;}inline void link(int x,int y) //{ makeroot(x); f[x]=y,splay(x);}inline void cut(int x,int y) //{ makeroot(x); access(y),splay(y); f[x]=ch[y][0]=0;}int main(){ int i,j,u,v,c,uu,vv; n=read(),m=read(); fo(i,1,n) key[i]=sum[i]=mul[i]=1; fo(i,2,n) { u=read(),v=read(); link(u,v); } while(m--) { scanf("%s",s); if(s[0]=='+') { u=read(),v=read(),c=read()%p; makeroot(u),access(v),splay(v); ope_add(v,c); } else if(s[0]=='-') { u=read(),v=read(),uu=read(),vv=read(); cut(u,v),link(uu,vv); } else if(s[0]=='*') { u=read(),v=read(),c=read()%p; makeroot(u),access(v),splay(v); ope_mul(v,c); } else { u=read(),v=read(); makeroot(u),access(v),splay(v); printf("%d\n",sum[v]); } } return 0;}
阅读全文
0 0
- bzoj 2631: tree
- BZOJ 2631 tree LCT
- BZOJ 2631 TREE
- 【LCT】BZOJ 2631:tree
- bzoj 2631 tree
- BZOJ 2631 Tree LCT
- BZOJ 2631 tree
- BZOJ 2631: tree
- BZOJ 2631: tree Link_Cut_Tree
- BZOJ 2631 tree LCT
- 【BZOJ 2631】tree LCT
- BZOJ 2631 tree
- bzoj 2631 tree
- BZOJ 2631: tree LCT
- bzoj 2631: tree LCT
- BZOJ 2631 Tree Link-Cut-Tree(LCT)
- BZOJ-2631 tree Link-Cut-Tree
- bzoj 2631 Tree [Link-Cut Tree]
- 位运算符的用法及C语言运算符优先级解析
- EventBus:Could not dispatch event: class to subscribing class
- Machine Learning第九讲[异常检测] --(二)创建一个异常检测系统
- ContentProvider获取手机联系人
- Java中的DatagramPacket与DatagramSocket的初步
- bzoj 2631 tree
- UESTC 1586 可以说是非常豹笑了 2-SAT+并查集
- Acach缓存的实现
- BM、GC、SGBM三种算法的比较和BM在OpenCV3下的参数设置
- 一些长期更新的小东西,容易忘记的
- 集合和数组的相互转换
- 链路聚合
- LeetCode专辑]【1-5题】
- php导出excel出现的问题