数据结构(动态树):[国家集训队2012]tree(伍一鸣)
【问题描述】
+ 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的余数。
【输入格式】
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作
【输出格式】
【样例输入】
1 2
2 3
* 1 3 4
/ 1 1
【样例输出】
【数据规模和约定】
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
犯了几个错误:
1.mul标记下传时没有让mul*k。
2.数组开小了。
3.递归栈慢!!!
3.
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int mod=51061; const int maxn=50010;int fir[maxn],nxt[maxn*2],to[maxn*2],cnt;void addedge(int a,int b){nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b; }int fa[maxn],rt[maxn]; int ch[maxn][2],key[maxn],sz[maxn]; int sum[maxn],flip[maxn],add[maxn],mul[maxn];void DFS(int x){rt[x]=sz[x]=key[x]=sum[x]=mul[x]=1;for(int i=fir[x];i;i=nxt[i]) if(to[i]!=1&&!fa[to[i]]){fa[to[i]]=x;DFS(to[i]);} }void Add(int x,int d){if(!x)return;key[x]=(key[x]+d)%mod;add[x]=(add[x]+d)%mod;sum[x]=(sum[x]+sz[x]*d%mod)%mod; }void Mul(int x,int k){key[x]=(key[x]*k)%mod;sum[x]=(sum[x]*k)%mod;add[x]=(add[x]*k)%mod; }void Flip(int x){swap(ch[x][0],ch[x][1]);flip[x]^=1; }void Push_down(int x){if(flip[x]){Flip(ch[x][0]);Flip(ch[x][1]);flip[x]=0;}if(mul[x]!=1){Mul(ch[x][0],mul[x]);Mul(ch[x][1],mul[x]);mul[x]=1;}if(add[x]){Add(ch[x][0],add[x]);Add(ch[x][1],add[x]);add[x]=0;} }void Push_up(int x){sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;sum[x]=(sum[ch[x][0]]+sum[ch[x][1]]+key[x])%mod; }void Rotate(int x){int y=fa[x],g=fa[y],c=ch[y][1]==x;ch[y][c]=ch[x][c^1];ch[x][c^1]=y;fa[ch[y][c]]=y;fa[y]=x;fa[x]=g;if(rt[y])rt[x]=1,rt[y]=0;else ch[g][ch[g][1]==y]=x;Push_up(y); }void P(int x){if(!rt[x])P(fa[x]);Push_down(x); }void Splay(int x){P(x);for(int y=fa[x];!rt[x];Rotate(x),y=fa[x])if(!rt[y])Rotate((ch[fa[y]][1]==y)==(ch[y][1]==x)?y:x);Push_up(x); }void Access(int x){int y=0;while(x){Splay(x);rt[ch[x][1]]=1;rt[ch[x][1]=y]=0;Push_up(x);x=fa[y=x];} }void Make_RT(int x){Access(x);Splay(x);Flip(x); }void Link(int x,int y){Make_RT(x);fa[x]=y; }void Cut(int x,int y){Make_RT(x);Splay(y);fa[ch[y][0]]=fa[y];fa[y]=0;rt[ch[y][0]]=1;ch[y][0]=0;Push_up(y); }void Lca(int &x,int &y){Access(y);y=0;while(true){Splay(x);if(!fa[x])break;rt[ch[x][1]]=1;rt[ch[x][1]=y]=0;Push_up(x);x=fa[y=x];} }void ADD(int x,int y,int d){Lca(x,y);Add(y,d);Add(ch[x][1],d);key[x]=(key[x]+d)%mod;Push_up(x); }void MUL(int x,int y,int k){Lca(x,y);Mul(y,k);Mul(ch[x][1],k);key[x]=(key[x]*k)%mod;Push_up(x); }int Query(int x,int y){Lca(x,y);int ret=(key[x]+sum[y]+sum[ch[x][1]])%mod;return ret; }int n,Q; char op[5]; int main(){ #ifndef ONLINE_JUDGEfreopen("nt2012_wym_tree.in","r",stdin);freopen("nt2012_wym_tree.out","w",stdout); #endifscanf("%d%d",&n,&Q);for(int i=1,a,b;i<n;i++){scanf("%d%d",&a,&b);addedge(a,b);addedge(b,a);}DFS(1);int x,y,c,u,v;while(Q--){scanf("%s",op);if(op[0]=='-'){scanf("%d%d",&u,&v);Cut(u,v);scanf("%d%d",&u,&v);Link(u,v);}else if(op[0]=='/'){scanf("%d%d",&x,&y);printf("%d\n",Query(x,y));}else{scanf("%d%d%d",&x,&y,&c);if(op[0]=='+')ADD(x,y,c);elseMUL(x,y,c); }}return 0; }
爆int!!!!!
转载于:https://www.cnblogs.com/TenderRun/p/5622999.html
数据结构(动态树):[国家集训队2012]tree(伍一鸣)相关推荐
- cogs1799 [国家集训队2012]tree(伍一鸣)
LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...
- [国家集训队2012]tree(陈立杰)
1764. [国家集训队2012]tree(陈立杰) ★★★ 输入文件: nt2012_tree.in 输出文件: nt2012_tree.out 简单对比 时间限制:3 s 内存限 ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- P2619 [国家集训队2]Tree I
P2619 [国家集训队2]Tree I 链接 分析: 为了确定白边选入的数量,所以给白边加一个权值,二分这个值,然后最小生成树.可以发现白边的数量虽这个值的增大而减小,满足单调性. 有一个问题:如果 ...
- [国家集训队2012]电子对撞机nbsp;解题…
国家集训队2012 电子对撞机(刘洪轩)解题报告 题目: 见http://cogs.pro/cogs/problem/problem.php?pid=1784 Q国最近科学技术不断进步,经过不懈努力, ...
- tree(陈立杰)[国家集训队2012]
时间限制:3.0s 内存限制:1.0GB [大意] 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. [输入格式] 第一行V,E,ne ...
- BZOJ2568 [国家集训队2012]比特集合
Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...
- [国家集训队2012]middle(陈立杰)
我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午-- 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的--今天又翻了几篇题解才恍然大悟,是把权值 ...
- Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分
新学的科技.设\(f(x)\)为选\(x\)条白色边的时候的最小生成树权值和,那么可以猜到它应该是一个下凸函数的形式. 如图,图中\(x\)坐标表示选的白色边条数,\(y\)坐标表示获得的权值,那么我 ...
最新文章
- c++多线程并发执行
- Linux-vmware tools安装与cdrom挂载
- 【知识星球】动态推理网络结构上新,不是所有的网络都是不变的
- HOT!闲来无聊,总结了下10个作为网民不得不知道的网址
- IOS开发沙盒路径的封装技术
- docker 6 docker运行的底层原理
- 【读书笔记】CSS代码规范
- [vb]FindWindow使用方法
- centos7安装RabbitMQ详细过程
- 乐高机器人巡线C语言程序,乐高机器人巡线原理.doc
- cad统计面积长度插件vlx_cad计算总长度插件
- 数据处理的神来之笔 解决缓存击穿的终极利器
- 数据分析/运营——数据异常的排查方法
- 去中心化和中心化哪个才是未来,Dex.top教你熊市生存指南
- 2022年国家高新技术企业申报秘笈来了
- 术语FXO和FXS的含义是什么?
- Vertu手机决定采用Android系统
- 惠普Z820安装win10系统攻略(固态作为系统盘)——思小瓜
- jtopo 告警 Alarm 换行 demo
- fiddle 配置