题目链接:https://www.luogu.org/problemnew/show/P4114

1.把边权转化到点权:选取连接这条边的两个点中较深的一个。

2.查询点到点之间的边权时,要从seg[x]+1 到 seg[y],因为seg[x]其实连接的是上面一条边的边权。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define ll long long
  6. #define lson left, mid, rt<<1
  7. #define rson mid + 1, right, rt<<1|1
  8. using namespace std;
  9. const ll maxn = 300000 + 10;
  10. char opt[9];
  11. ll n, m, root, res;
  12. ll top[maxn], rev[maxn], seg[maxn], son[maxn];
  13. ll fa[maxn], size[maxn], deep[maxn];
  14. ll u[maxn], v[maxn], w[maxn];
  15. ll tree[maxn<<2], lazy[maxn<<2], num, node[maxn];
  16. struct edge{
  17. ll next, from, to, len;
  18. }e[maxn<<2];
  19. ll head[maxn], cnt;
  20. void add(ll u, ll v, ll w)
  21. {
  22. e[++cnt].from = u;
  23. e[cnt].len = w;
  24. e[cnt].next = head[u];
  25. e[cnt].to = v;
  26. head[u] = cnt;
  27. }
  28. //-----segment_tree-----
  29. void PushUP(ll rt)
  30. {
  31. tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
  32. }
  33. void build(ll left, ll right, ll rt)
  34. {
  35. if(left == right)
  36. {
  37. tree[rt] = rev[left];
  38. return;
  39. }
  40. ll mid = (left + right)>>1;
  41. build(lson);
  42. build(rson);
  43. PushUP(rt);
  44. }
  45. void PushDOWN(ll rt)
  46. {
  47. lazy[rt<<1] = lazy[rt];
  48. lazy[rt<<1|1] = lazy[rt];
  49. tree[rt<<1] = lazy[rt];
  50. tree[rt<<1|1] = lazy[rt];
  51. lazy[rt] = 0;
  52. }
  53. void update(ll l, ll r, ll add, ll left, ll right, ll rt)
  54. {
  55. if(l <= left && r >= right)
  56. {
  57. tree[rt] = add;
  58. lazy[rt] = add;
  59. return;
  60. }
  61. ll mid = (left + right)>>1;
  62. if(lazy[rt]) PushDOWN(rt);
  63. if(l <= mid) update(l, r, add, lson);
  64. if(r > mid) update(l, r, add, rson);
  65. PushUP(rt);
  66. }
  67. ll query(ll l, ll r, ll left, ll right, ll rt)
  68. {
  69. ll res = -0x7fffffff;
  70. if(l <= left && r >= right)
  71. {
  72. return tree[rt];
  73. }
  74. ll mid = (left + right)>>1;
  75. if(lazy[rt]) PushDOWN(rt);
  76. if(l <= mid) res = max(res, query(l, r, lson));
  77. if(r > mid) res = max(res, query(l, r, rson));
  78. return res;
  79. }
  80. //----------------------
  81. void dfs1(ll u, ll f, ll d)
  82. {
  83. ll maxson = -1;
  84. size[u] = 1;
  85. deep[u] = d;
  86. fa[u] = f;
  87. for(ll i = head[u]; i != -1; i = e[i].next)
  88. {
  89. ll v = e[i].to;
  90. if(f != v)
  91. {
  92. dfs1(v, u, d+1);
  93. size[u] += size[v];
  94. if(size[v] > maxson) son[u] = v, maxson = size[v];
  95. }
  96. }
  97. }
  98. void dfs2(ll u, ll t)
  99. {
  100. seg[u] = ++num;
  101. rev[num] = node[u];
  102. top[u] = t;
  103. if(!son[u]) return;
  104. dfs2(son[u], t);
  105. for(ll i = head[u]; i != -1; i = e[i].next)
  106. {
  107. ll v = e[i].to;
  108. if(v == son[u] || v == fa[u]) continue;
  109. dfs2(v,v);
  110. }
  111. }
  112. void updRange(ll x, ll y, ll k)
  113. {
  114. while(top[x] != top[y])
  115. {
  116. if(deep[top[x]] < deep[top[y]]) swap(x, y);
  117. update(seg[top[x]], seg[x], k, 1, n, 1);
  118. x = fa[top[x]];
  119. }
  120. if(deep[x] > deep[y]) swap(x, y);
  121. update(seg[x], seg[y], k, 1, n, 1);
  122. }
  123. ll qRange(ll x, ll y)
  124. {
  125. ll ans = 0;
  126. while(top[x] != top[y])
  127. {
  128. if(deep[top[x]] < deep[top[y]]) swap(x, y);
  129. res = 0;
  130. res = query(seg[top[x]], seg[x], 1, n, 1);
  131. ans = max(res, ans);
  132. x = fa[top[x]];
  133. }
  134. if(deep[x] > deep[y]) swap(x, y);
  135. res = 0;
  136. res = query(seg[x]+1, seg[y], 1, n, 1);
  137. ans = max(res, ans);
  138. return ans;
  139. }
  140. int main()
  141. {
  142. memset(head, -1, sizeof(head));
  143. scanf("%lld",&n);
  144. root = 1;
  145. for(ll i = 1; i < n; i++)
  146. {
  147. scanf("%lld%lld%lld",&u[i],&v[i],&w[i]);
  148. add(u[i],v[i],w[i]); add(v[i],u[i],w[i]);
  149. }
  150. dfs1(root, 0, 1);
  151. //for(int i = 1; i <= n; i++) cout<<deep[i]<<" ";
  152. for(ll i = 1; i < n; i++)
  153. {
  154. if(deep[u[i]] < deep[v[i]]) node[v[i]] = w[i];
  155. else node[u[i]] = w[i];
  156. }
  157. //for(int i = 1; i <= n; i++) cout<<node[i]<<" ";
  158. dfs2(root, root);
  159. build(1, n, 1);
  160. while(cin>>opt && opt[0] != 'D')
  161. {
  162. ll x, y, z;
  163. if(opt[0] == 'C')
  164. {
  165. scanf("%lld%lld",&x,&y);
  166. if(deep[u[x]] > deep[v[x]]) updRange(u[x], u[x], y);
  167. else updRange(v[x], v[x], y);
  168. }
  169. else
  170. {
  171. scanf("%lld%lld",&x,&y);
  172. if(x == y)
  173. {
  174. printf("0\n");
  175. continue;
  176. }
  177. printf("%lld\n",qRange(x,y));
  178. }
  179. }
  180. }

【luogu P4114 Qtree1】 题解的更多相关文章

  1. 洛谷 P4114 Qtree1 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例: 输出样例: 说明 说明 思路 Change Query AC代码 总结 题面 题目链接 P4114 Qt ...

  2. 洛谷 - P4114 - Qtree1 - 重链剖分

    https://www.luogu.org/problem/P4114 维护边权的话,用深度大的点表示这条边(可以遍历一边边询问两端深度,这样不需要修改dfs1,也可以在dfs1的时候向下走的同时把边 ...

  3. 【luogu P3946 ことりのおやつ】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h ...

  4. 洛谷P4114 Qtree1

    题目描述 给定一棵\(n\)个节点的树,有两个操作: \(CHANGE\) \(i\) \(t_i\) 把第\(i\)条边的边权变成\(t_i\) \(QUERY\) \(a\) \(b\) 输出从\ ...

  5. Luogu P2210 Haywire 题解

    其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法, ...

  6. [Luogu P4178]Tree 题解(点分治+平衡树)

    题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...

  7. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  8. Luogu P2158 仪仗队 题解报告

    题目传送门 [题目大意] 给定一个n×n的点方阵,求站在左下角的点能看到的点数 注意同一条直线上只能看到一个点 [思路分析] 因为是一个方阵,所以可以对称地算,那么对于半个方阵,这里假设是左上的半个方 ...

  9. P4114 Qtree1

    思路 树剖一发,注意对LCA的处理 代码 #include <cstdio> #include <algorithm> #include <cstring> usi ...

随机推荐

  1. connection reset by peer, socket write error问题排查

    2018-03-15更新:弄明白connection reset产生的原因,见重新分析connection reset by peer, socket write error错误原因 在开发文件上传功 ...

  2. innosetup的静默安装与卸载

    静默安装,就是减少程序与用户的交互,一站式的安装过程(一气呵成) 1. 静默安装参数 innosetup的静默安装是通过参数来控制的 1.1.  /silent                     ...

  3. flex buider 4.6 打开设计模式(designer)时提示内存不足错误的解决办法

    先申明,此方法只适用于flex builder 4.6及以下版本, flex builder 4.7以后已经完全取消了designer功能,是没有办法补救的. 1. 首先下载APE文件,这个文件好像是 ...

  4. 几道web题简单总结

    拖了好长时间,总结一下这一段时间做的几道值得记录一下的题目,有的没做出来,但是学习到了新的东西 1.homebrew event loop ddctf的一道题目,学到了python eval函数的用法 ...

  5. JavaScript资源分享

    一. 资源教程: 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 ...

  6. avalon实现日期联动

    前言 上一篇我们说了下Avalon的一些概念,以及一些主要特性,至于Avalon的一些基础教程,正美老师已经做了非常全面的讲述,参见:http://www.cnblogs.com/rubylouvre ...

  7. (转)vs2010 vs2013等vs中如何统计整个项目的代码行数

    在一个大工程中有很多的源文件和头文件,我如何快速统计总行数? ------解决方案-------------------- b*[^:b#/]+.*$ ^b*[^:b#/]+.*$ ctrl + sh ...

  8. TensorFlow入门:mac 安装 TensorFlow

    开发环境: mac os 10.12.5 Python 2.7.10 GCC 4.2.1 mac默认是不带pip的,安装pip. sudo easy_install pip 1.安装virtualen ...

  9. 前端自动分环境打包(vue和ant design)

    现实中的问题:有时候版本上线的时候,打包时忘记切换环境,将测试包推上正式服务器,那你就会被批了. 期望:在写打包的命令行的时候就觉得自己在打包正式版本,避免推包时候的,不确信自己的包是否正确. 既然有 ...

  10. 使用 iframe + postMessage 实现跨域通信

    在实际项目开发中可能会碰到在 a.com 页面中嵌套 b.com 页面,这时第一反应是使用 iframe,但是产品又提出在 a.com 中操作,b.com 中进行显示,或者相反. 1.postMess ...