题目链接【http://acm.hdu.edu.cn/showproblem.php?pid=5692】

题意:一棵树,每个节点有权值,有两种操作:1、修改某个点的权值,2、求以x根的子树中的节点到根的权值和的最大值。

题解:DFS序:对点进行重新编号,每个子树中的所有的节点的编号是连续的。映射到线段树上,进行区间修改,区间查询。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. const int maxn = 1e6 + ;
  7. int T, N, Q;
  8. LL a[maxn], sum[maxn];
  9. struct Edge
  10. {
  11. int to, next;
  12. Edge (int to = , int next = ): to(to), next(next) {}
  13. } E[maxn * ];
  14. int head[maxn], tot;
  15. void initEdge()
  16. {
  17. for(int i = ; i <= N + ; i++) head[i] = -;
  18. tot = ;
  19. }
  20. void addEdge(int u, int v)
  21. {
  22. E[tot] = Edge(v, head[u]);
  23. head[u] = tot++;
  24. }
  25. int L[maxn], R[maxn], dfs_clock;
  26. void DFS(int u, int fa)
  27. {
  28. L[u] = ++dfs_clock;
  29. sum[L[u]] = a[u] + sum[L[fa]];
  30. for(int k = head[u]; ~k; k = E[k].next)
  31. {
  32. int v = E[k].to;
  33. if(v == fa) continue;
  34. DFS(v, u);
  35. }
  36. R[u] = dfs_clock;
  37. }
  38. LL ma[maxn * ], fg[maxn * ];
  39. void Build(int id, int L, int R)
  40. {
  41. fg[id] = ;
  42. if(L == R)
  43. {
  44. ma[id] = sum[L];
  45. return ;
  46. }
  47. int mid = (L + R) >> ;
  48. Build(id << , L, mid);
  49. Build(id << | , mid + , R);
  50. ma[id] = max(ma[id << ], ma[id << | ]);
  51. }
  52. inline void push_down(int id)
  53. {
  54. if(fg[id])
  55. {
  56. fg[id << ] += fg[id];
  57. ma[id << ] += fg[id];
  58. fg[id << | ] += fg[id];
  59. ma[id << | ] += fg[id];
  60. fg[id] = ;
  61. }
  62. }
  63. void update(int id, int L, int R, int l, int r, LL val)
  64. {
  65. if(L == l && R == r)
  66. {
  67. fg[id] += val;
  68. ma[id] += val;
  69. return ;
  70. }
  71. push_down(id);
  72. int mid = (L + R) >> ;
  73. if(r <= mid)
  74. update(id << , L, mid, l, r, val);
  75. else if(l >= mid + )
  76. update(id << | , mid + , R, l, r, val);
  77. else
  78. {
  79. update(id << , L, mid, l, mid, val);
  80. update(id << | , mid + , R, mid + , r, val);
  81. }
  82. ma[id] = max(ma[id << ], ma[id << | ]);
  83. }
  84. LL query(int id, int L, int R, int l, int r)
  85. {
  86. if(L == l && R == r)
  87. return ma[id];
  88. push_down(id);
  89. int mid = (L + R) >> ;
  90. if(r <= mid)
  91. return query(id << , L, mid, l, r);
  92. else if(l >= mid + )
  93. return query(id << | , mid + , R, l, r);
  94. else
  95. {
  96. LL t = query(id << , L, mid, l, mid);
  97. return max(t, query(id << | , mid + , R, mid + , r));
  98. }
  99. }
  100. int main ()
  101. {
  102. int ic = ;
  103. scanf("%d", &T);
  104. while(T--)
  105. {
  106. scanf("%d %d", &N, &Q);
  107. initEdge();
  108. for(int i = ; i <= N - ; i++)
  109. {
  110. int u, v;
  111. scanf("%d %d", &u, &v);
  112. addEdge(u + , v + );
  113. addEdge(v + , u + );
  114. }
  115. for(int i = ; i <= N; i++) scanf("%lld", &a[i]);
  116. dfs_clock = , DFS(, );
  117. Build(, , N);
  118. printf("Case #%d:\n", ++ic);
  119. for(int i = ; i <= Q; i++)
  120. {
  121. int ty, x;
  122. LL y;
  123. scanf("%d", &ty);
  124. if(ty == )
  125. {
  126. scanf("%d %lld", &x, &y);
  127. x++;
  128. update(, , N, L[x], R[x], y - a[x]);
  129. a[x] = y;
  130. }
  131. else if(ty == )
  132. {
  133. scanf("%d", &x);
  134. x++;
  135. LL ans = query(, , N, L[x], R[x]);
  136. printf("%lld\n", ans);
  137. }
  138. }
  139. }
  140. return ;
  141. }

HDU 5692 Snacks的更多相关文章

  1. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  2. HDU 5692 Snacks bfs版本dfs序 线段树

    Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...

  3. 【DFS序+线段树区间更新区间求最值】HDU 5692 Snacks

    http://acm.hdu.edu.cn/showproblem.php?pid=5692 [思路] 每更新一个点,子树的所有结点都要更新,所以是区间更新 每查询一个点,子树的所有结点都要查询,所以 ...

  4. hdu 5692 Snacks 线段树+dfs

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. hdu 5692 Snacks(dfs时间戳+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  6. HDU 5692 Snacks(DFS序+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  8. hdu 5692(dfs+线段树) Snacks

    题目http://acm.hdu.edu.cn/showproblem.php?pid=5692 题目说每个点至多经过一次,那么就是只能一条路线走到底的意思,看到这题的格式, 多个询问多个更新, 自然 ...

  9. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

随机推荐

  1. 【Nginx】修改响应头,根据不同请求IP重定向到不同IP

    背景: 使用CAS登录的过程中会涉及到三次重定向,如果在同一个局域网内,是没有任何问题的,但如果涉及到跨网访问,这个问题就比较蛋疼了. 解决思路: 通过Nginx对要访问的系统进行代理,根据请求IP来 ...

  2. 查询PHP版本

    查询php版本: phpinfo();

  3. tp5 r3 一个简单的SQL语句调试实例

    tp5 r3 一个简单的SQL语句调试实例先看效果核心代码 public function index() { if (IS_AJAX && session("uid&quo ...

  4. Python 正则表达式、re模块

    一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是 ...

  5. 批量删除.svn文件夹和.svn文件

    新建可运行文件 Windows环境 将下面的代码保存为 kill-svn.bat文件,放到要删除.svn文件的目录下,双击运行即可 @echo on @rem 删除SVN版本控制目录 @rem for ...

  6. git版本控制系统常见操作总结

    简介 Git是强大的版本控制系统,主要功能是针对代码.配置文件等文本进行版本控制.备份等,同时个人认为还是分发代码的一个不错的方式. 常见用法 #创建远程git仓库 [root@test88 ~]# ...

  7. Idea安装Scala插件(转)

    原文链接:http://blog.csdn.net/a2011480169/article/details/52712421 参考博客: 1.http://wwwlouxuemingcom.blog. ...

  8. [HTML]增加input标签的multiple属性上传的文件数

    .发现问题 <input type="file" name="myfile[]" multiple="multiple"/> 最 ...

  9. linux 下配置文件目录/etc/sysconfig

    /etc/sysconfig/目录详解 2010-06-19 11:12 6693人阅读 评论(1) 收藏 举报 桌面环境debugging防火墙serviceunix语言 /etc/sysconfi ...

  10. leetcode 之trap water(8)

    这题不太好想.可以先扫描找到最高的柱子,然后分别处理两边:记录下当前的局部最高点,如果当前点小于局部最高点,加上, 反则,替换当前点为局部最高点. int trapWater(int A[], int ...