题目传送门

这道题可以树链剖分+线段树。

其他操作模板,第二个操作只需要将x~x+size[x]-1区间加值即可。

code:

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int read(){
  6. char c;while(c=getchar(),(c<''||c>'')&&c!='-');
  7. int x=,y=;c=='-'?y=-:x=c-'';
  8. while(c=getchar(),c>=''&&c<='')x=x*+c-'';
  9. return x*y;
  10. }
  11.  
  12. const int Maxn=;
  13.  
  14. int N,Q,A[Maxn];
  15. int head[Maxn],nxt[Maxn<<],to[Maxn<<],Cnt;
  16. void Add(int x,int y){
  17. to[Cnt]=y;
  18. nxt[Cnt]=head[x];
  19. head[x]=Cnt;
  20. Cnt++;
  21. }
  22.  
  23. int Son[Maxn],Size[Maxn],f[Maxn];
  24. int Dep[Maxn],Dfn[Maxn],Top[Maxn];
  25. int C;
  26. void Find(int Now,int Deep,int Bef){
  27.  
  28. f[Now]=Bef,Dep[Now]=Deep,Size[Now]=;
  29. for(int i=head[Now];i!=-;i=nxt[i]){
  30. if(to[i]==f[Now])continue;
  31. Find(to[i],Deep+,Now);
  32. Size[Now]+=Size[to[i]];
  33. if(Size[to[i]]>Size[Son[Now]])
  34. Son[Now]=to[i];
  35. }
  36. return ;
  37. }
  38. void Fs(int Now,int Tp){
  39. Dfn[Now]=++C,Top[Now]=Tp;
  40. if(Son[Now])Fs(Son[Now],Tp);
  41. for(int i=head[Now];i!=-;i=nxt[i]){
  42. if(to[i]==Son[Now]||to[i]==f[Now])continue;
  43. Fs(to[i],to[i]);
  44. }
  45. return ;
  46. }
  47.  
  48. long long Seg[Maxn<<],Ade[Maxn<<];
  49. void Up(int x){Seg[x]=Seg[x<<]+Seg[x<<|];}
  50. void Down(int x,long long l,long long r){
  51. if(!Ade[x])return ;
  52. Seg[x<<]+=Ade[x]*l;
  53. Seg[x<<|]+=Ade[x]*r;
  54. Ade[x<<]+=Ade[x];
  55. Ade[x<<|]+=Ade[x];
  56. Ade[x]=;
  57. }
  58. void Updata(int Node,int L,int R,int Ul,int Ur,long long Val){
  59. if(Ul<=L&&Ur>=R){
  60. Seg[Node]+=Val*(R-L+);
  61. Ade[Node]+=Val;
  62. return ;
  63. }
  64. int Mid=L+R>>;
  65. Down(Node,Mid-L+,R-Mid);
  66. if(Mid>=Ul)Updata(Node<<,L,Mid,Ul,Ur,Val);
  67. if(Mid< Ur)Updata(Node<<|,Mid+,R,Ul,Ur,Val);
  68. Up(Node);
  69. }
  70. long long Query(int Node,int L,int R,int Ql,int Qr){
  71. if(Ql<=L&&Qr>=R)return Seg[Node];
  72. int Mid=L+R>>;
  73. Down(Node,Mid-L+,R-Mid);
  74. long long Ans=;
  75. if(Mid>=Ql)Ans+=Query(Node<<,L,Mid,Ql,Qr);
  76. if(Mid< Qr)Ans+=Query(Node<<|,Mid+,R,Ql,Qr);
  77. return Ans;
  78. }
  79. long long G(int Node){
  80. long long Ans=;
  81. while(Top[Node]){
  82. Ans+=Query(,,N,Dfn[Top[Node]],Dfn[Node]);
  83. Node=f[Top[Node]];
  84. }
  85. return Ans;
  86. }
  87.  
  88. int main()
  89. {
  90. memset(head,-,sizeof head);
  91. N=read(),Q=read();
  92. for(int i=;i<=N;i++)A[i]=read();
  93. for(int i=;i<N;i++){
  94. int x=read(),y=read();
  95. Add(x,y),Add(y,x);
  96. }
  97. Find(,,),Fs(,);
  98. for(int i=;i<=N;i++)
  99. Updata(,,N,Dfn[i],Dfn[i],A[i]);
  100. for(int i=;i<=Q;i++){
  101. int Type=read(),x=read();
  102. if(Type==)Updata(,,N,Dfn[x],Dfn[x],read());
  103. if(Type==)Updata(,,N,Dfn[x],Dfn[x]+Size[x]-,read());
  104. if(Type==)printf("%lld\n",G(x));
  105. }
  106. return ;
  107. }

BZOJ4034_树上操作_KEY的更多相关文章

  1. 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树

    [BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...

  2. HAOI2015 树上操作

    HAOI2015 树上操作 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根 ...

  3. bzoj千题计划242:bzoj4034: [HAOI2015]树上操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...

  4. bzoj4034[HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6163  Solved: 2025[Submit][Stat ...

  5. 树剖||树链剖分||线段树||BZOJ4034||Luogu3178||[HAOI2015]树上操作

    题面:P3178 [HAOI2015]树上操作 好像其他人都嫌这道题太容易了懒得讲,好吧那我讲. 题解:第一个操作和第二个操作本质上是一样的,所以可以合并.唯一值得讲的点就是:第二个操作要求把某个节点 ...

  6. P3178 [HAOI2015]树上操作

    P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 #include <bits/stdc++.h> #define int long l ...

  7. bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4352  Solved: 1387[Submit][Stat ...

  8. bzoj 4034: [HAOI2015]树上操作 (树剖+线段树 子树操作)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6779  Solved: 2275[Submit][Stat ...

  9. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

随机推荐

  1. Running Protractor Tests on Docker

    配置这个Protractor环境真是折磨死人了,webdriver-manage update怎么都不成功,即使自己下载好chromederiver放到相应文件夹下,也不能使用.费时三四天终于按照ht ...

  2. BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  3. 【jQuery】学习jQuery插件的使用与写法(表单验证插件-validation)

    最新最全的插件可以从jQuery官方网站的插件板块下载,网站地址为:http://plugins.jquery.com/ Validation优点:内置验证规则:自定义验证规则:简单强大的验证信息提示 ...

  4. l2-loss,l2正则化,l2范数,欧式距离

    欧式距离: l2范数: l2正则化: l2-loss(也叫平方损失函数): http://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Mimic ...

  5. Exp6 信息收集与漏洞扫描 20164314

    一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务 ...

  6. Mac 下 SVN 的使用

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  7. css z-index之object flash层级问题

    <object type="application/x-shockwave-flash" data="flash文件路径" style="z-i ...

  8. 配置tomcat的用户名和密码

    <role rolename="manager-gui"/> <role rolename="manager-script"/> < ...

  9. 编译nginx错误:make[1]: *** [/pcre//Makefile] Error 127

    --with-pcre=DIR 是设置源码目录,而不是编译安装后的目录.

  10. 关于DP

    关于DP 似乎摸到了门槛呢,学着学着Dijkstra突然有了感觉. 我们遍历的时候会遍历整张图的每个点每条边,然后与已知的对比大小,如果比现在方案好,就放入数组 那么,DP岂不是同样的思想? 在背包问 ...