题目链接:Codeforces 191C Fools and Roads

题目大意:给定一个N节点的数。然后有M次操作,每次从u移动到v。问说每条边被移动过的次数。

解题思路:树链剖分维护边,用一个数组标记就可以,不须要用线段树。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 1e5 + 5;
  6. int N, Q, ne, first[maxn], f[maxn], jump[maxn * 2];
  7. int id, idx[maxn], top[maxn], far[maxn], son[maxn], dep[maxn], cnt[maxn];
  8. struct Edge {
  9. int u, v;
  10. void set (int u, int v) {
  11. this->u = u;
  12. this->v = v;
  13. }
  14. }ed[maxn * 2];
  15. void dfs (int u, int pre, int d) {
  16. far[u] = pre;
  17. dep[u] = d;
  18. cnt[u] = 1;
  19. son[u] = 0;
  20. for (int i = first[u]; i + 1; i = jump[i]) {
  21. int v = ed[i].v;
  22. if (v == pre)
  23. continue;
  24. dfs(v, u, d + 1);
  25. cnt[u] += cnt[v];
  26. if (cnt[son[u]] < cnt[v])
  27. son[u] = v;
  28. }
  29. }
  30. void dfs(int u, int rot) {
  31. top[u] = rot;
  32. idx[u] = ++id;
  33. if (son[u])
  34. dfs(son[u], rot);
  35. for (int i = first[u]; i + 1; i = jump[i]) {
  36. int v = ed[i].v;
  37. if (v == far[u] || v == son[u])
  38. continue;
  39. dfs(v, v);
  40. }
  41. }
  42. inline void add_Edge(int u, int v) {
  43. ed[ne].set(u, v);
  44. jump[ne] = first[u];
  45. first[u] = ne++;
  46. }
  47. void init () {
  48. int u, v;
  49. ne = id = 0;
  50. memset(first, -1, sizeof(first));
  51. scanf("%d", &N);
  52. for (int i = 1; i < N; i++) {
  53. scanf("%d%d", &u, &v);
  54. add_Edge(u, v);
  55. add_Edge(v, u);
  56. }
  57. dfs(1, 0, 0);
  58. dfs(1, 1);
  59. for (int i = 0; i < N - 1; i++) {
  60. int t = i * 2;
  61. if (dep[ed[t].u] < dep[ed[t].v])
  62. swap(ed[t].u, ed[t].v);
  63. }
  64. }
  65. inline void add (int l, int r) {
  66. f[l]++, f[r + 1]--;
  67. }
  68. void solve (int u, int v) {
  69. int p = top[u], q = top[v];
  70. while (p != q) {
  71. if (dep[p] < dep[q]) {
  72. swap(p, q);
  73. swap(u, v);
  74. }
  75. add(idx[p], idx[u]);
  76. u = far[p];
  77. p = top[u];
  78. }
  79. if (u == v)
  80. return;
  81. if (dep[u] > dep[v])
  82. swap(u, v);
  83. add(idx[son[u]], idx[v]);
  84. }
  85. int main () {
  86. init();
  87. scanf("%d", &Q);
  88. int u, v;
  89. while (Q--) {
  90. scanf("%d%d", &u, &v);
  91. solve(u, v);
  92. }
  93. int mv = 0;
  94. for (int i = 1; i <= N; i++) {
  95. mv += f[i];
  96. f[i] = mv;
  97. }
  98. printf("%d", f[idx[ed[0].u]]);
  99. for (int i = 1; i < N - 1; i++)
  100. printf(" %d", f[idx[ed[i*2].u]]);
  101. printf("\n");
  102. return 0;
  103. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

Codeforces 191C Fools and Roads(树链拆分)的更多相关文章

  1. Codeforces 191 C Fools and Roads (树链拆分)

    主题链接~~> 做题情绪:做了HDU 5044后就感觉非常easy了. 解题思路: 先树链剖分一下,把树剖分成链,由于最后全是询问,so~能够线性操作.经过树链剖分后,就会形成很多链,可是每条边 ...

  2. hdu5044 Tree 树链拆分,点细分,刚,非递归版本

    hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...

  3. CF 191C Fools and Roads lca 或者 树链剖分

    They say that Berland has exactly two problems, fools and roads. Besides, Berland has n cities, popu ...

  4. CF191C Fools and Roads - 树剖解法

    Codeforces Round #121 (Div. 1) C. Fools and Roads time limit per test :2 seconds memory limit per te ...

  5. HYSBZ 2243 染色 (树链拆分)

    主题链接~~> 做题情绪:这题思路好想.调试代码调试了好久.第一次写线段树区间合并. 解题思路: 树链剖分 + 线段树区间合并 线段树的端点记录左右区间的颜色.颜色数目.合并的时候就用区间合并的 ...

  6. poj 3237 Tree(树链拆分)

    题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...

  7. hdu 4912 Paths on the tree(树链拆分+贪婪)

    题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...

  8. BZOJ 3589 动态树 树链拆分+纳入和排除定理

    标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ...

  9. POJ 3237 Tree (树链拆分)

    主题链接~~> 做题情绪:了. 解题思路: 主要注意如何区间更新就ok了 . 树链剖分就是树上的线段树. 代码: #include<iostream> #include<sst ...

随机推荐

  1. aliyun.com

    https://help.aliyun.com/knowledge_detail/39495.html?spm=5176.7839494.2.1.AhdvPM

  2. poj 1852 Ants_贪心

    题目大意:很多的蚂蚁都在长度为L(cm)的膀子上爬行,它们的速度都是1cm/s,到了棒子终端的时候,蚂蚁就会掉下去.如果在爬行途中遇到其他蚂蚁,两只蚂蚁的方向都会逆转.已知蚂蚁在棒子的最初位置坐标,但 ...

  3. nyoj 1237 最大岛屿(dfs)

    描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王. 这是一个由海洋.岛屿和海盗组 ...

  4. checkbook全选/反选/全不选

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  5. Win8开发疑问与解答

    疑问:怎样获取开发者许可证 打开VS2012时,怎么在没有取得开发者许可证之前,屏蔽/跳过弹出的窗体“获取Windows8开发者许可证 你需要具有开发者许可证才能开发适用于......” 打开Blen ...

  6. [DevExpress]图表开发工具类 ChartUtils

    /// <summary> /// 基于.NET 3.5的Chart工具类;对应的DevExpress版本:12.1.7; /// </summary> public stat ...

  7. sublime安装和汉化

    对程序员来说,在不同的平台下有不同的IDE,网上很多教程都是使用DW,以致DW大名鼎鼎.其实,还有一些我们不为熟知的,却超级牛X的编辑器,我相信Sublime Text就是其中之一. 官方下载地址:h ...

  8. document.createElement()的用法

    今天做项目需要做个添加地址栏和前面需要一个按钮,就看到了这篇文章! document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore ...

  9. C#中Json字符串的各种应用类

    在程序中任何事物及信息都可以用对象进行描述和承载,除了比较流行的xml之外,还有一种简洁快速处理目标信息的形式那就是Json格式. 首先Json格式有自己固定的格式:例如person这个对象就可以简单 ...

  10. C# 3循环 for语句应用

    class 做图形 { static void Main(string[] args) { //打印下列图形 //★★★★★ //★★★★★ //★★★★★ //★★★★★ //★★★★★ // 图( ...