原题链接

每个点开一个权值线段树,然后用树上差分的方法修改,最后自底向上暴力线段树合并即可。

不过空间较大,会\(MLE\),写个内存池就可以了。

  1. #include<cstdio>
  2. #include<cmath>
  3. using namespace std;
  4. const int N = 1e5 + 10;
  5. const int M = 6e6 + 10;
  6. struct dd {
  7. int x, y, z;
  8. };
  9. dd a[N];
  10. int fi[N], di[N << 1], ne[N << 1], ro[N], S[M], CO[M], L[M], R[M], de[N], f[N][18], an[N], sta[M], l, ma, gn, SEG, tp;
  11. inline int re()
  12. {
  13. int x = 0;
  14. char c = getchar();
  15. bool p = 0;
  16. for (; c < '0' || c > '9'; c = getchar())
  17. p |= c == '-';
  18. for (; c >= '0' && c <= '9'; c = getchar())
  19. x = x * 10 + c - '0';
  20. return p ? -x : x;
  21. }
  22. inline void add(int x, int y)
  23. {
  24. di[++l] = y;
  25. ne[l] = fi[x];
  26. fi[x] = l;
  27. }
  28. inline void sw(int &x, int &y)
  29. {
  30. int z = x;
  31. x = y;
  32. y = z;
  33. }
  34. inline int maxn(int x, int y){ return x > y ? x : y; }
  35. void dfs(int x)
  36. {
  37. int i, y;
  38. for (i = 1; i <= gn; i++)
  39. f[x][i] = f[f[x][i - 1]][i - 1];
  40. for (i = fi[x]; i; i = ne[i])
  41. if (!de[y = di[i]])
  42. {
  43. de[y] = de[x] + 1;
  44. f[y][0] = x;
  45. dfs(y);
  46. }
  47. }
  48. int lca(int x, int y)
  49. {
  50. int i;
  51. if (de[x] > de[y])
  52. sw(x, y);
  53. for (i = gn; ~i; i--)
  54. if (de[f[y][i]] >= de[x])
  55. y = f[y][i];
  56. if (!(x ^ y))
  57. return x;
  58. for (i = gn; ~i; i--)
  59. if (f[x][i] ^ f[y][i])
  60. {
  61. x = f[x][i];
  62. y = f[y][i];
  63. }
  64. return f[x][0];
  65. }
  66. void pp(int r)
  67. {
  68. int lx = L[r], rx = R[r];
  69. if (S[lx] < S[rx])
  70. {
  71. S[r] = S[rx];
  72. CO[r] = CO[rx];
  73. }
  74. else
  75. {
  76. S[r] = S[lx];
  77. CO[r] = CO[lx];
  78. }
  79. }
  80. inline void rec(int x){ sta[++tp] = x; }
  81. inline int NEW(){ return tp ? sta[tp--] : ++SEG; }
  82. void mdf(int &r, int x, int y, int k, int v)
  83. {
  84. if (!r)
  85. r = ++SEG;
  86. if (!(x ^ y))
  87. {
  88. S[r] += v;
  89. S[r] > 0 ? CO[r] = x : CO[r] = 0;
  90. return;
  91. }
  92. int mid = (x + y) >> 1;
  93. k <= mid ? mdf(L[r], x, mid, k, v) : mdf(R[r], mid + 1, y, k, v);
  94. pp(r);
  95. }
  96. int merge(int x, int y, int r_1, int r_2)
  97. {
  98. if (!r_1)
  99. return r_2;
  100. if (!r_2)
  101. return r_1;
  102. int r = NEW();
  103. if (!(x ^ y))
  104. {
  105. S[r] = S[r_1] + S[r_2];
  106. S[r] > 0 ? CO[r] = x : CO[r] = 0;
  107. return r;
  108. }
  109. int mid = (x + y) >> 1;
  110. L[r] = merge(x, mid, L[r_1], L[r_2]);
  111. R[r] = merge(mid + 1, y, R[r_1], R[r_2]);
  112. pp(r);
  113. rec(r_1);
  114. rec(r_2);
  115. return r;
  116. }
  117. void UPD(int x)
  118. {
  119. int i, y;
  120. for (i = fi[x]; i; i = ne[i])
  121. if ((y = di[i]) ^ f[x][0])
  122. {
  123. UPD(y);
  124. ro[x] = merge(1, ma, ro[x], ro[y]);
  125. }
  126. an[x] = CO[ro[x]];
  127. }
  128. int main()
  129. {
  130. int i, n, m, x, y, LCA;
  131. n = re();
  132. m = re();
  133. gn = log2(n);
  134. for (i = 1; i < n; i++)
  135. {
  136. x = re();
  137. y = re();
  138. add(x, y);
  139. add(y, x);
  140. }
  141. de[1] = 1;
  142. dfs(1);
  143. for (i = 1; i <= m; i++)
  144. {
  145. a[i].x = re();
  146. a[i].y = re();
  147. a[i].z = re();
  148. ma = maxn(ma, a[i].z);
  149. }
  150. for (i = 1; i <= m; i++)
  151. {
  152. LCA = lca(a[i].x, a[i].y);
  153. mdf(ro[a[i].x], 1, ma, a[i].z, 1);
  154. mdf(ro[a[i].y], 1, ma, a[i].z, 1);
  155. mdf(ro[LCA], 1, ma, a[i].z, -1);
  156. if (LCA ^ 1)
  157. mdf(ro[f[LCA][0]], 1, ma, a[i].z, -1);
  158. }
  159. UPD(1);
  160. for (i = 1; i <= n; i++)
  161. printf("%d\n", an[i]);
  162. return 0;
  163. }

洛谷4556 [Vani有约会]雨天的尾巴的更多相关文章

  1. 洛谷 P4556 [Vani有约会]雨天的尾巴 解题报告

    P4556 [Vani有约会]雨天的尾巴 题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒 ...

  2. 洛谷P4556 [Vani有约会]雨天的尾巴(线段树合并)

    题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地 ...

  3. 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)

    传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...

  4. 洛咕 P4556 [Vani有约会]雨天的尾巴

    终于把考试题清完了...又复活了... 树上差分,合并用线段树合并,但是空间会炸. 某大佬:lca和fa[lca]减得时候一定已经存在这个节点了,所以放进vector里,合并完之后减掉就好了... 玄 ...

  5. [Vani有约会]雨天的尾巴 线段树合并

    [Vani有约会]雨天的尾巴 LG传送门 线段树合并入门好题. 先别急着上线段树合并,考虑一下这题的暴力.一看就是树上差分,对于每一个节点统计每种救济粮的数量,再一遍dfs把差分的结果统计成答案.如果 ...

  6. P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)

    P4556 [Vani有约会]雨天的尾巴 每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作. 离线处理完向上合并就好了 luogu倍增lca被卡了5分.....于是用rmq维护.... 常 ...

  7. P4556 [Vani有约会]雨天的尾巴 (线段树合并)

    P4556 [Vani有约会]雨天的尾巴 题意: 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋 ...

  8. 「Luogu4556」Vani有约会-雨天的尾巴

    「Luogu4556」Vani有约会-雨天的尾巴 传送门 很显然可以考虑树上差分+桶,每次更新一条链就是把这条链上的点在桶对应位置打上 \(1\) 的标记, 最后对每个点取桶中非零值的位置作为答案即可 ...

  9. [题解] P4556 [Vani有约会]雨天的尾巴

    [题解] P4556 [Vani有约会]雨天的尾巴 ·题目大意 给定一棵树,有m次修改操作,每次修改 \(( x\) \(y\) \(z )\) 表示 \((x,y)\) 之间的路径上数值 \(z\) ...

随机推荐

  1. spring boot通过Interceptor和HandlerMethodReturnValueHandler实现统一处理为controller返回对象统计处理时间

    思路:实现思路都是基于Aop实现,方式上可以通过spring aop和spring mvc的aop机制都能实现. 通过Interceptor的可以实现为controller插入开始时间和执行结束时间, ...

  2. 在内存中加载DLL

    有个需求是把一个DLL作为数据打包到EXE中,运行的时候动态加载.但要求不是释放出来生成DLL文件加载. 花了一天时间做出来.效果还可以. 不过由于是直接分配内存加载DLL的.有一些小缺陷.例如遍历进 ...

  3. windows7 64位安装tensorflow 1.4.0 CPU版本

    机器学习和深度学习真是新生代的宠儿,我也被安排来搞这个了,这下是真的从0开始了.看了几天ppt,想跑跑代码试试,装个环境. 都说tensorflow很火很好用,反正我什么也不懂,准备把这些框架一个一个 ...

  4. VLAN中继协议

    VTP(VLAN Trunking Protocol):是VLAN中继协议,也被称为虚拟局域网干道协议.作用是十几台交换机在企业网中,配置VLAN工作量大,使用VTP协议,把一台交换机配置成VTP S ...

  5. Hibernate工作原理及为什么要用?

    1.原理: 1.读取并解析配置文件    new Configuration().configure()2.读取并解析映射信息,创建SessionFactory    sf=buildSessionF ...

  6. 9-安装redis

    1.在linux上安装C语言环境 yum install gcc-c++ 2.解压源码包 tar -xvf /opt/soft/redis-3.0.0.tar -C /opt/app/ 3.编译源码( ...

  7. Suricata之outputs(输出选项)

    outputs stats.log(统计数据包信息的日志) 配置文件:默认开启,数据包统计时间间隔默认为8S 日志文件:主要统计规定时间间隔内数据包的总量,各种不同类型数据包的数量以及数据包的大小等信 ...

  8. python导包路径的修改

    1.sys os 模块 import sys import os 2.查看默认的导包路路径: print(sys.path) 3.路径拼接 os.path.join(url, 'apps')) 4.追 ...

  9. js跨域传值,兼容ie8以上

    js跨域传值,兼容ie8以上 事先说明,此方法并不支持ie8,如果想要支持ie8的话,需要用这种思路(来自微软): if (window.addEventListener) { window.addE ...

  10. java 流转换BASE64的一些问题

    java 转换BASE64过程中,出现很多结尾为空的问题!暂时不清楚为什么会这样- ``` java //根据url地址转换成BASE64 public static String getURLIma ...