4034: [HAOI2015]树上操作

链接

思路:

  树链剖分。操作:单点修改,路径查询,子树修改。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<cctype>
  7.  
  8. using namespace std;
  9.  
  10. const int N = ;
  11. typedef long long LL;
  12.  
  13. struct Edge{
  14. int to,nxt;
  15. Edge() {}
  16. Edge(int a,int b) {to = a,nxt = b;}
  17. }e[N<<];
  18. int head[N],tot;
  19. LL sum[N<<],tag[N<<],w[N],data[N];
  20. int pos[N],siz[N],son[N],bel[N],deth[N],fa[N];
  21. int tn;
  22.  
  23. inline int read() {
  24. int x = ,f = ;char ch = getchar();
  25. for (; !isdigit(ch); ch=getchar()) if(ch=='-') f = -;
  26. for (; isdigit(ch); ch=getchar()) x = x*+ch-'';
  27. return x * f;
  28. }
  29. void add_edge(int u,int v) {
  30. e[++tot] = Edge(v,head[u]);head[u] = tot;
  31. e[++tot] = Edge(u,head[v]);head[v] = tot;
  32. }
  33. void dfs1(int u,int pa) {
  34. siz[u] = ;
  35. deth[u] = deth[pa] + ;
  36. fa[u] = pa;
  37. for (int i=head[u]; i; i=e[i].nxt) {
  38. int v = e[i].to;
  39. if (v==pa) continue;
  40. dfs1(v,u);
  41. siz[u] += siz[v];
  42. if (!son[u] || siz[son[u]]<siz[v]) son[u] = v;
  43. }
  44. }
  45. void dfs2(int u,int top) {
  46. bel[u] = top;
  47. pos[u] = ++tn;
  48. data[pos[u]] = w[u];
  49. if (!son[u]) return;
  50. dfs2(son[u],top);
  51. for (int i=head[u]; i; i=e[i].nxt) {
  52. int v = e[i].to;
  53. if (v==fa[u] || v==son[u]) continue;
  54. dfs2(v,v);
  55. }
  56. }
  57.  
  58. #define lson l,mid,rt<<1
  59. #define rson mid+1,r,rt<<1|1
  60.  
  61. void pushup(int rt) {
  62. sum[rt] = sum[rt<<] + sum[rt<<|];
  63. }
  64. void pushdown(int rt,int len) {
  65. if (tag[rt]) {
  66. sum[rt<<] += 1ll * tag[rt] * (len-len/);tag[rt<<] += tag[rt];
  67. sum[rt<<|] += 1ll * tag[rt] * (len/);tag[rt<<|] += tag[rt];
  68. tag[rt] = ;
  69. }
  70. }
  71. void build(int l,int r,int rt) {
  72. if (l==r) {
  73. sum[rt] = data[l];
  74. return ;
  75. }
  76. int mid = (l + r) / ;
  77. build (lson);
  78. build (rson);
  79. pushup(rt);
  80. }
  81. void update(int l,int r,int rt,int L,int R,LL x) {
  82. if (L <= l && r <= R) {
  83. sum[rt] += 1ll * (r - l + ) * x;
  84. tag[rt] += x;
  85. return ;
  86. }
  87. pushdown(rt,r-l+);
  88. int mid = (l + r) / ;
  89. if (L <= mid) update(lson,L,R,x);
  90. if (R > mid) update(rson,L,R,x);
  91. pushup(rt);
  92. }
  93. LL query(int l,int r,int rt,int L,int R) {
  94. if (L <= l && r <= R) {
  95. return sum[rt];
  96. }
  97. int mid = (l + r) / ;
  98. LL ret = ;
  99. pushdown(rt,r-l+);
  100. if (L <= mid) ret += query(lson,L,R);
  101. if (R > mid) ret += query(rson,L,R);
  102. return ret;
  103. }
  104. void Ask(int x,int y) {
  105. LL ans = ;
  106. while (bel[x] != bel[y]) {
  107. if (deth[bel[x]] < deth[bel[y]]) swap(x,y);
  108. ans += query(,tn,,pos[bel[x]],pos[x]);
  109. x = fa[bel[x]];
  110. }
  111. if (deth[x] < deth[y]) swap(x,y);
  112. ans += query(,tn,,pos[y],pos[x]);
  113. printf("%lld\n",ans);
  114. }
  115. int main() {
  116. int n = read(),m = read();
  117. for (int i=; i<=n; ++i) w[i] = read();
  118. for (int i=; i<n; ++i) {
  119. int u = read(),v = read();
  120. add_edge(u,v);
  121. }
  122. dfs1(,);
  123. dfs2(,);
  124. build(,tn,);
  125. LL a;
  126. while (m--) {
  127. int opt = read(),x = read();
  128. if (opt == ) {
  129. a = read();
  130. update(,tn,,pos[x],pos[x],a);
  131. }
  132. else if (opt==) {
  133. a = read();
  134. update(,tn,,pos[x],pos[x]+siz[x]-,a);
  135. }
  136. else Ask(x,);
  137. }
  138. return ;
  139. }

4034: [HAOI2015]树上操作的更多相关文章

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

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

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

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

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

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

  4. [BZOJ]4034: [HAOI2015]树上操作

    [HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和. 题解:树链剖分 操作1 ...

  5. bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和

    题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...

  6. BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)

    题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  7. BZOJ 4034: [HAOI2015]树上操作 [欧拉序列 线段树]

    题意: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 显然树链剖分可做 ...

  8. 4034. [HAOI2015]树上操作【树链剖分】

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  9. bzoj 4034: [HAOI2015]树上操作——树链剖分

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

随机推荐

  1. 构建跨平台APP开发的两本书,这里重点推荐下

    第一本是<构建跨平台:jquery Mobile移动应用实战> 是目前jqm开发写的比较入门的一本书,上手很快,但是高手我觉得就没有必要学习了,因为写的比较浅显. 第二本是<构建跨平 ...

  2. 【转】run方法与start方法的区别

    在java线程中 start与run的不同start与run方法的主要区别在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,然而在你直接调用run方法的时候 ...

  3. java研发常见问题总结 1

    1.java中所有类的父类是什么?他都有什么方法? Object类是所有类的直接或间接基类,如果一个类在声明时未继承基类,Java就默认其基类是Object,故Object被称为根类.该类位于java ...

  4. 爬虫第一篇基本库的使用——urllib

    在Python2中有urllib2和urllib3两个库来实现请求的发送,在Pyhon3中则统一为urllib. urilib包含以下4个模块 request:最基本的请求模块,可以用来实现请求的发送 ...

  5. 最长公共单词,类似LCS,(POJ2250)

    题目链接:http://poj.org/problem?id=2250 解题报告: 1.状态转移方程: ; i<=len1; i++) { ; j<=len2; j++) { dp[i][ ...

  6. 基于ngx_lua模块的waf开发实践

    0x00 常见WAF简单分析 WAF主要分为硬件WAF和软件防火墙,硬件WAF如绿盟的NSFOCUS Web Application Firewall,软件防火墙比较有名的是ModSecurity,再 ...

  7. 2017.11.24 算法分析与设计------Gay格雷码

    1. 格雷码问题: 对于给定的正整数n,格雷码为满足如下条件的一个编码序列: (1) 序列由2n个编码组成,每个编码都是长度为n的二进制位串. (2) 序列中无相同的编码. (3) 序列中位置相邻的两 ...

  8. Entity Framework的扩展库

    https://github.com/jcachat/EntityFramework.DynamicFilters Provides global & scoped filters for E ...

  9. wcf 的小介绍

    http://www.cnblogs.com/scottckt/archive/2010/10/15/1852136.html

  10. ImportError: No module named images

    [问题] 在使用学习wxPython时,一个Dem抱有如题所示错误 [解决] images 只不过是wxpython自带demo中的一个文件 体验wxpython IN action的时候Import ...