题目链接

题意:

  分粮食我就当成涂色了。有n个点的一棵树,在a到b的路上都涂上c颜色,颜色可重复叠加,问最后每一个点的最大颜色数量的颜色类型。

思路:

  首先这题的输出是每一个点最后的情况,考虑离线做法。简化版问题:在一条线段上涂色,问每个点的最后的情况,假设在[a, b]区间涂色,那么在开始的位置a标记开始涂色,在结束的位置标记结束涂色,一棵动态的颜色树,维护当前颜色数量最大的数量。那么这题也可以考虑这么做,先对树进行树链剖分,然后按照剖分顺序dfn来遍历,提前读入所有操作,在涂色的两端标记,后面操作和简化版一样了。

  1. #include <bits/stdc++.h>
  2.  
  3. const int N = 1e5 + 5;
  4.  
  5. std::vector<int> edges[N];
  6. int n, m;
  7.  
  8. //颜色树
  9. #define lson l, mid, o << 1
  10. #define rson mid + 1, r, o << 1 | 1
  11.  
  12. int mx[N<<2];
  13.  
  14. void push_up(int o) {
  15. mx[o] = std::max (mx[o<<1], mx[o<<1|1]);
  16. }
  17.  
  18. void build(int l, int r, int o) {
  19. mx[o] = 0;
  20. if (l == r) return ;
  21. int mid = l + r >> 1;
  22. build (lson);
  23. build (rson);
  24. }
  25.  
  26. void updata(int p, int c, int l, int r, int o) {
  27. if (l == r) {
  28. mx[o] += c;
  29. return ;
  30. }
  31. int mid = l + r >> 1;
  32. if (p <= mid) updata (p, c, lson);
  33. else updata (p, c, rson);
  34. push_up (o);
  35. }
  36.  
  37. int query(int l, int r, int o) {
  38. if (l == r) return l;
  39. int mid = l + r >> 1;
  40. if (mx[o<<1] == mx[o]) return query (lson);
  41. else return query (rson);
  42. }
  43.  
  44. int sz[N], fa[N], dfn[N], belong[N];
  45. int idx[N];
  46. int tim;
  47.  
  48. void DFS2(int u, int chain) {
  49. dfn[u] = ++tim;
  50. idx[tim] = u;
  51. belong[u] = chain;
  52. int k = 0;
  53. for (auto v: edges[u]) {
  54. if (v == fa[u]) continue;
  55. if (sz[v] > sz[k]) k = v;
  56. }
  57. if (k) DFS2 (k, chain);
  58. for (auto v: edges[u]) {
  59. if (v == fa[u] || v == k) continue;
  60. DFS2 (v, v);
  61. }
  62. }
  63.  
  64. void DFS(int u, int pa) {
  65. sz[u] = 1;
  66. fa[u] = pa;
  67. for (auto v: edges[u]) {
  68. if (v == pa) continue;
  69. DFS (v, u);
  70. sz[u] += sz[v];
  71. }
  72. }
  73.  
  74. std::vector<int> add[N], sub[N];
  75. int ans[N];
  76.  
  77. void mark(int a, int b, int c) {
  78. int p = belong[a], q = belong[b];
  79. while (p != q) {
  80. if (dfn[p] < dfn[q]) {
  81. std::swap (p, q);
  82. std::swap (a, b);
  83. }
  84. add[dfn[p]].push_back (c);
  85. sub[dfn[a]+1].push_back (c); //son[a]
  86. a = fa[p];
  87. p = belong[a];
  88. }
  89. if (dfn[a] < dfn[b]) std::swap (a, b);
  90. add[dfn[b]].push_back (c);
  91. sub[dfn[a]+1].push_back (c);
  92. }
  93.  
  94. void prepare() {
  95. sz[0] = 0;
  96. DFS (1, 0);
  97. tim = 0;
  98. DFS2 (1, 1);
  99. }
  100.  
  101. int main() {
  102. while (scanf ("%d%d", &n, &m) == 2 && n + m) {
  103. for (int i=1; i<=n; ++i) {
  104. edges[i].clear ();
  105. add[i].clear ();
  106. sub[i].clear ();
  107. }
  108. for (int i=1; i<n; ++i) {
  109. int u, v;
  110. scanf ("%d%d", &u, &v);
  111. edges[u].push_back (v);
  112. edges[v].push_back (u);
  113. }
  114.  
  115. prepare ();
  116.  
  117. int maxc = 1;
  118. for (int i=1; i<=m; ++i) {
  119. int a, b, c;
  120. scanf ("%d%d%d", &a, &b, &c);
  121. mark (a, b, c);
  122. maxc = std::max (maxc, c);
  123. }
  124.  
  125. build (1, maxc, 1);
  126.  
  127. //dfn
  128. for (int i=1; i<=n; ++i) {
  129. for (int j=0; j<add[i].size (); ++j) {
  130. updata (add[i][j], 1, 1, maxc, 1);
  131. }
  132. for (int j=0; j<sub[i].size (); ++j) {
  133. updata (sub[i][j], -1, 1, maxc, 1);
  134. }
  135. ans[idx[i]] = mx[1] ? query (1, maxc, 1) : 0;
  136. }
  137.  
  138. for (int i=1; i<=n; ++i) {
  139. printf ("%d\n", ans[i]);
  140. }
  141. }
  142. return 0;
  143. }

  

树链剖分+线段树 HDOJ 5029 Relief grain(分配粮食)的更多相关文章

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  2. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  3. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  4. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  5. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  6. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  7. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  8. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  9. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  10. bzoj2243[SDOI2011]染色 树链剖分+线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9012  Solved: 3375[Submit][Status ...

随机推荐

  1. jaee开发起步:tomcat服务器的配置

    1.将下载下来的apache-tomcat-6.0.13.zip解压到任意文件夹. (打开tomcat官网,选择下载tomcat6.x.zip版本的tomcat不需要安装,直接解压并配置一下环境变量就 ...

  2. Linux编程环境

    yum -y install gcc gcc-c++ libtool-ltdl libtool-ltdl-devel openssl openssl-devel curl curl-devel lib ...

  3. ng-repeat 里 使用ng-show ng-hide出现闪动

    在项目中使用ng-repeat在表格中循环输出一组数据的时候,需要对表格中的每一列(每一列为数组的一个元素--对象)添加控制按钮. 列表样式 我的期望是 初始化 ----每一行不可编辑,保存按钮是隐藏 ...

  4. highcharts

    preparation Highcharts Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: 对个人用 ...

  5. 使用Ruby来实现批量更新AD中字段

    准备工作 安装需要用到的gem gem install net-ldap gem install roo 准备好要更新的数据,比如exel表: /root/account.xlsx,内容如下 姓名 性 ...

  6. oracle 学习笔记(三)

    1. SQL(基础查询) 1.1. 基本查询语句 1.1.1. FROM子句 SQL查询语句的语法如下:   SELECT <*, column [alias], -> FROM tabl ...

  7. linux回退到上次访问目录

    cd / cd ..  回到上级目录 cd - 回到上次访问目录

  8. ffmpeg-20161104[07,10,16,21,22,27,30]-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  9. C++小结

    1.输入:cin>>变量名: 输出:cout<<变量名<<endl: 2.类 public 公有,此类及其他类中使用   private 私有,只能在本类中使用   ...

  10. 【python】nuitka封装python

    官网:http://nuitka.net/doc/user-manual.html python打包工具对比:http://blog.csdn.net/qwemicheal/article/detai ...