【问题描述】

一棵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的余数。

【输入格式】

第一行两个整数n,q
接下来n-1行每行两个正整数u,v,描述这棵树
接下来q行,每行描述一个操作

【输出格式】

对于每个/对应的答案输出一行

【样例输入】

3 2
1 2
2 3
* 1 3 4
/ 1 1

【样例输出】

4

【数据规模和约定】

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(伍一鸣)相关推荐

  1. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  2. [国家集训队2012]tree(陈立杰)

    1764. [国家集训队2012]tree(陈立杰) ★★★   输入文件: nt2012_tree.in   输出文件: nt2012_tree.out    简单对比 时间限制:3 s   内存限 ...

  3. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  4. P2619 [国家集训队2]Tree I

    P2619 [国家集训队2]Tree I 链接 分析: 为了确定白边选入的数量,所以给白边加一个权值,二分这个值,然后最小生成树.可以发现白边的数量虽这个值的增大而减小,满足单调性. 有一个问题:如果 ...

  5. [国家集训队2012]电子对撞机nbsp;解题…

    国家集训队2012 电子对撞机(刘洪轩)解题报告 题目: 见http://cogs.pro/cogs/problem/problem.php?pid=1784 Q国最近科学技术不断进步,经过不懈努力, ...

  6. tree(陈立杰)[国家集训队2012]

    时间限制:3.0s   内存限制:1.0GB [大意] 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. [输入格式] 第一行V,E,ne ...

  7. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  8. [国家集训队2012]middle(陈立杰)

    我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午-- 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的--今天又翻了几篇题解才恍然大悟,是把权值 ...

  9. Luogu P2619 [国家集训队2]Tree I 凸优化,wqs二分

    新学的科技.设\(f(x)\)为选\(x\)条白色边的时候的最小生成树权值和,那么可以猜到它应该是一个下凸函数的形式. 如图,图中\(x\)坐标表示选的白色边条数,\(y\)坐标表示获得的权值,那么我 ...

最新文章

  1. c++多线程并发执行
  2. Linux-vmware tools安装与cdrom挂载
  3. 【知识星球】动态推理网络结构上新,不是所有的网络都是不变的
  4. HOT!闲来无聊,总结了下10个作为网民不得不知道的网址
  5. IOS开发沙盒路径的封装技术
  6. docker 6 docker运行的底层原理
  7. 【读书笔记】CSS代码规范
  8. [vb]FindWindow使用方法
  9. centos7安装RabbitMQ详细过程
  10. 乐高机器人巡线C语言程序,乐高机器人巡线原理.doc
  11. cad统计面积长度插件vlx_cad计算总长度插件
  12. 数据处理的神来之笔 解决缓存击穿的终极利器
  13. 数据分析/运营——数据异常的排查方法
  14. 去中心化和中心化哪个才是未来,Dex.top教你熊市生存指南
  15. 2022年国家高新技术企业申报秘笈来了
  16. 术语FXO和FXS的含义是什么?
  17. Vertu手机决定采用Android系统
  18. 惠普Z820安装win10系统攻略(固态作为系统盘)——思小瓜
  19. jtopo 告警 Alarm 换行 demo
  20. fiddle 配置

热门文章

  1. Geoffrey Hinton大佬经典的《神经网络机器学习》,附PPT下载链接!
  2. 深度隐式表达系列 (一)
  3. 面向小姐姐的编程——java面向对象之final、static关键字
  4. java数组写99乘法表,Java 实现乘法口诀(99乘法表)
  5. Jmeter 新手教程
  6. Inception v2/v3原理与实现
  7. java数组代表unicode值么,02-Java的数组
  8. 软考信息安全工程师学习笔记汇总
  9. Java基础---数据类型转换和运算符
  10. 小汤学编程之JavaEE学习day05——会话管理、文件上传与下载、Ajax