[Luogu] 树
https://www.luogu.org/problemnew/show/P4092
树剖 + 线段树区间修改,单点查询
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + ;
- inline int read() {int ret; scanf("%d", &ret); return ret;}
- int n, T;
- int now = , head[N];
- struct Node {int u, v, nxt;} G[N << ];
- int fa[N], top[N], size[N], son[N], deep[N], lst[N], rst[N], tree[N], tim;
- int F[N << ];
- int Answer;
- struct Node_A{
- inline void Add(int u, int v) {G[now].v = v; G[now].nxt = head[u]; head[u] = now ++;}
- void Dfs_1(int u, int f_, int dep) {
- fa[u] = f_; deep[u] = dep; size[u] = ;
- for(int i = head[u]; ~ i; i = G[i].nxt) {
- int v = G[i].v;
- if(v != f_) {
- Dfs_1(v, u, dep + );
- size[u] += size[v];
- if(size[v] > size[son[u]]) son[u] = v;
- }
- }
- }
- void Dfs_2(int u, int tp) {
- top[u] = tp; tree[u] = ++ tim; lst[u] = tim;
- if(!son[u]) {rst[u] = tim; return ;}
- Dfs_2(son[u], tp);
- for(int i = head[u]; ~ i; i = G[i].nxt) {
- int v = G[i].v;
- if(v != fa[u] and v != son[u]) Dfs_2(v, v);
- }
- rst[u] = tim;
- }
- #define lson jd << 1
- #define rson jd << 1 | 1
- void Build_tree(int l, int r, int jd) {
- if(l == r) {F[jd] = ; return ;}
- int mid = (l + r) >> ;
- Build_tree(l, mid, lson);
- Build_tree(mid + , r, rson);
- }
- void Down(int jd) {
- int imp = F[jd];
- if(deep[imp] > deep[F[lson]]) F[lson] = imp;
- if(deep[imp] > deep[F[rson]]) F[rson] = imp;
- F[jd] = ;
- }
- void Sec_G(int l, int r, int jd, int x, int y, int g) {
- if(x <= l and r <= y) {
- if(deep[F[jd]] < deep[g]) F[jd] = g;
- return ;
- }
- if(F[jd]) Down(jd);
- int mid = (l + r) >> ;
- if(x <= mid) Sec_G(l, mid, lson, x, y, g);
- if(y > mid) Sec_G(mid + , r, rson, x, y, g);
- }
- void Poi_A(int l, int r, int jd, int x) {
- if(l == r) {Answer = F[jd]; return ;}
- if(F[jd]) Down(jd);
- int mid = (l + r) >> ;
- if(x <= mid) Poi_A(l, mid, lson, x);
- else Poi_A(mid + , r, rson, x);
- }
- }Tj;
- int main() {
- n = read(); T = read();
- for(int i = ; i <= n; i ++) head[i] = -;
- for(int i = ; i < n; i ++) {
- int u = read(), v = read();
- Tj.Add(u, v); Tj.Add(v, u);
- }
- Tj.Dfs_1(, , );
- Tj.Dfs_2(, );
- Tj.Build_tree(, n, );
- while(T --) {
- string s; cin >> s;
- if(s[] == 'C') {int x = read(); Tj.Sec_G(, n, , lst[x], rst[x], x);}
- else {int x = read(); Tj.Poi_A(, n, , tree[x]); cout << Answer << "\n";}
- }
- return ;
- }
- /*
- 5 5
- 1 2
- 1 3
- 2 4
- 2 5
- Q 2
- C 2
- Q 2
- Q 5
- Q 3
- */
[Luogu] 树的更多相关文章
- [Luogu] 树链剖分
模板题,对于对为某个点为根的子树进行处理时,只需每个节点记录两个值 分别为搜索以该节点为根的子树时的最初搜索序和最末搜索序,将这两 个数作为线段树区间操作的端点进行操作 #include <bi ...
- [Luogu] 树状数组
https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)
CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...
- Luogu Dynamic Ranking (带修改的主席树)
题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...
- Luogu 45887 全村最好的嘤嘤刀(线段树 树状数组)
https://www.luogu.org/problemnew/show/T45887 题目背景 重阳节到了,我们最好的八重樱拥有全村最好的嘤嘤刀…… 题目描述 在绯玉丸力量的影响下,八重村成了一条 ...
- Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)
题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集 ...
- Luogu 4294 [WC2008]游览计划 | 斯坦纳树
题目链接 Luogu 4294 (我做这道题的时候BZOJ全站的SPJ都炸了 提交秒WA 幸好有洛谷) 题解 这道题是[斯坦纳树]的经典例题.斯坦纳树是这样一类问题:带边权无向图上有几个(一般约10个 ...
随机推荐
- select in关键字查询匹配多个字段
select id from table where (num,name) in ((num1,'name1'),(num2,'name2'))
- TCP协议探究(三):RTT、滑动窗口和阻塞处理
1 RTT算法 1.1 概述 上一节说了重传机制需要设置一个重传超时值(RTO,Retransmission TimeOut),RTO设长了,重发太慢:设短了,可能导致包没有丢,就重发了,可能导致雪崩 ...
- SQLServer从渣仔到小白
一.将查询结果插入到另一张表 1. 查询结果插入新表 select * into tableA from tableB where … 2. 查询结果插入已经存在的表 insert into tabl ...
- 如何使用classnames模块库为react动态添加class类样式
摘要 在react中添加动态的css时,传统的方式较为繁琐,今天刚好学习到一个模块库可以便捷的解决这个问题.对的,它就是“classnames”. classnames模块库 npm安装 npm in ...
- css文本超出隐藏 显示三个点
文本超出显示三个点一般分两种情况 一,单行文本超出隐藏 overflow:hidden; text-overflow:ellipsis; white-space:nowrap; 二,多行文本超出隐藏 ...
- 微信公众号开发(三)—— access_token的管理
上一篇 微信公众号开发(二)—— 微信公众平台接入 让我们的本地工程顺利的接入到微信公众号系统, 那么接下啦我们介绍一个很重要的感念——acess_token (access_token是公众号的全局 ...
- linux数码管驱动程序和应用程序
- 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 ...
- Navicat连接腾讯云实例MySQL
Navicat连接腾讯云实例MySQL 授权所有的用户通过root账户 root密码登陆远程数据库 连接腾讯云实例上的MySQL数据库 这里的密码填入数据库的密码 这里的密码填入登陆云实例的密码也就是 ...
- asp.net 页面静态化
页面静态化,有三种方式 伪静态 真静态,折中法 现在我做的是折中发 创建一个asp.net 页面, 连接跳转到还未生成的页面 创建HttpHandle类 using System;using ...