https://www.luogu.org/problemnew/show/P4092

树剖 + 线段树区间修改,单点查询

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 1e5 + ;
  5.  
  6. inline int read() {int ret; scanf("%d", &ret); return ret;}
  7.  
  8. int n, T;
  9. int now = , head[N];
  10. struct Node {int u, v, nxt;} G[N << ];
  11. int fa[N], top[N], size[N], son[N], deep[N], lst[N], rst[N], tree[N], tim;
  12. int F[N << ];
  13. int Answer;
  14.  
  15. struct Node_A{
  16. inline void Add(int u, int v) {G[now].v = v; G[now].nxt = head[u]; head[u] = now ++;}
  17. void Dfs_1(int u, int f_, int dep) {
  18. fa[u] = f_; deep[u] = dep; size[u] = ;
  19. for(int i = head[u]; ~ i; i = G[i].nxt) {
  20. int v = G[i].v;
  21. if(v != f_) {
  22. Dfs_1(v, u, dep + );
  23. size[u] += size[v];
  24. if(size[v] > size[son[u]]) son[u] = v;
  25. }
  26. }
  27. }
  28. void Dfs_2(int u, int tp) {
  29. top[u] = tp; tree[u] = ++ tim; lst[u] = tim;
  30. if(!son[u]) {rst[u] = tim; return ;}
  31. Dfs_2(son[u], tp);
  32. for(int i = head[u]; ~ i; i = G[i].nxt) {
  33. int v = G[i].v;
  34. if(v != fa[u] and v != son[u]) Dfs_2(v, v);
  35. }
  36. rst[u] = tim;
  37. }
  38. #define lson jd << 1
  39. #define rson jd << 1 | 1
  40. void Build_tree(int l, int r, int jd) {
  41. if(l == r) {F[jd] = ; return ;}
  42. int mid = (l + r) >> ;
  43. Build_tree(l, mid, lson);
  44. Build_tree(mid + , r, rson);
  45. }
  46. void Down(int jd) {
  47. int imp = F[jd];
  48. if(deep[imp] > deep[F[lson]]) F[lson] = imp;
  49. if(deep[imp] > deep[F[rson]]) F[rson] = imp;
  50. F[jd] = ;
  51. }
  52. void Sec_G(int l, int r, int jd, int x, int y, int g) {
  53. if(x <= l and r <= y) {
  54. if(deep[F[jd]] < deep[g]) F[jd] = g;
  55. return ;
  56. }
  57. if(F[jd]) Down(jd);
  58. int mid = (l + r) >> ;
  59. if(x <= mid) Sec_G(l, mid, lson, x, y, g);
  60. if(y > mid) Sec_G(mid + , r, rson, x, y, g);
  61. }
  62. void Poi_A(int l, int r, int jd, int x) {
  63. if(l == r) {Answer = F[jd]; return ;}
  64. if(F[jd]) Down(jd);
  65. int mid = (l + r) >> ;
  66. if(x <= mid) Poi_A(l, mid, lson, x);
  67. else Poi_A(mid + , r, rson, x);
  68. }
  69. }Tj;
  70.  
  71. int main() {
  72. n = read(); T = read();
  73. for(int i = ; i <= n; i ++) head[i] = -;
  74. for(int i = ; i < n; i ++) {
  75. int u = read(), v = read();
  76. Tj.Add(u, v); Tj.Add(v, u);
  77. }
  78. Tj.Dfs_1(, , );
  79. Tj.Dfs_2(, );
  80. Tj.Build_tree(, n, );
  81. while(T --) {
  82. string s; cin >> s;
  83. if(s[] == 'C') {int x = read(); Tj.Sec_G(, n, , lst[x], rst[x], x);}
  84. else {int x = read(); Tj.Poi_A(, n, , tree[x]); cout << Answer << "\n";}
  85. }
  86. return ;
  87. }
  88. /*
  89. 5 5
  90. 1 2
  91. 1 3
  92. 2 4
  93. 2 5
  94. Q 2
  95. C 2
  96. Q 2
  97. Q 5
  98. Q 3
  99. */

[Luogu] 树的更多相关文章

  1. [Luogu] 树链剖分

    模板题,对于对为某个点为根的子树进行处理时,只需每个节点记录两个值 分别为搜索以该节点为根的子树时的最初搜索序和最末搜索序,将这两 个数作为线段树区间操作的端点进行操作 #include <bi ...

  2. [Luogu] 树状数组

    https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...

  3. 线段树简单入门 (含普通线段树, zkw线段树, 主席树)

    线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...

  4. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  5. CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)

    CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...

  6. Luogu Dynamic Ranking (带修改的主席树)

    题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...

  7. Luogu 45887 全村最好的嘤嘤刀(线段树 树状数组)

    https://www.luogu.org/problemnew/show/T45887 题目背景 重阳节到了,我们最好的八重樱拥有全村最好的嘤嘤刀…… 题目描述 在绯玉丸力量的影响下,八重村成了一条 ...

  8. Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)

    题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...

  9. Luogu 4294 [WC2008]游览计划 | 斯坦纳树

    题目链接 Luogu 4294 (我做这道题的时候BZOJ全站的SPJ都炸了 提交秒WA 幸好有洛谷) 题解 这道题是[斯坦纳树]的经典例题.斯坦纳树是这样一类问题:带边权无向图上有几个(一般约10个 ...

随机推荐

  1. select in关键字查询匹配多个字段

    select id from table where (num,name) in ((num1,'name1'),(num2,'name2'))

  2. TCP协议探究(三):RTT、滑动窗口和阻塞处理

    1 RTT算法 1.1 概述 上一节说了重传机制需要设置一个重传超时值(RTO,Retransmission TimeOut),RTO设长了,重发太慢:设短了,可能导致包没有丢,就重发了,可能导致雪崩 ...

  3. SQLServer从渣仔到小白

    一.将查询结果插入到另一张表 1. 查询结果插入新表 select * into tableA from tableB where … 2. 查询结果插入已经存在的表 insert into tabl ...

  4. 如何使用classnames模块库为react动态添加class类样式

    摘要 在react中添加动态的css时,传统的方式较为繁琐,今天刚好学习到一个模块库可以便捷的解决这个问题.对的,它就是“classnames”. classnames模块库 npm安装 npm in ...

  5. css文本超出隐藏 显示三个点

    文本超出显示三个点一般分两种情况 一,单行文本超出隐藏 overflow:hidden; text-overflow:ellipsis; white-space:nowrap; 二,多行文本超出隐藏 ...

  6. 微信公众号开发(三)—— access_token的管理

    上一篇 微信公众号开发(二)—— 微信公众平台接入 让我们的本地工程顺利的接入到微信公众号系统, 那么接下啦我们介绍一个很重要的感念——acess_token (access_token是公众号的全局 ...

  7. linux数码管驱动程序和应用程序

  8. kafka启动失败错误:: replica.fetch.max.bytes should be equal or greater than message.max.bytes

    1 详细异常 2019-10-14 14:38:21,260 FATAL kafka.Kafka$: java.lang.IllegalArgumentException: requirement f ...

  9. Navicat连接腾讯云实例MySQL

    Navicat连接腾讯云实例MySQL 授权所有的用户通过root账户 root密码登陆远程数据库 连接腾讯云实例上的MySQL数据库 这里的密码填入数据库的密码 这里的密码填入登陆云实例的密码也就是 ...

  10. asp.net 页面静态化

    页面静态化,有三种方式 伪静态  真静态,折中法  现在我做的是折中发 创建一个asp.net  页面,  连接跳转到还未生成的页面 创建HttpHandle类 using System;using ...