CF893F Subtree Minimum Query 主席树
如果是求和就很好做了...
不是求和也无伤大雅....
一维太难限制条件了,考虑二维限制
一维$dfs$序,一维$dep$序
询问$(x, k)$对应着在$dfs$上查$[dfn[x], dfn[x] + sz[x] - 1]$,在$dep$序上查$[dep[x], dep[x] + k]$
这样子,每个询问对应查询一段矩形内的最小值
然而树套树是过不了的.....
发现一个询问看似在$dep$序上对应了一段区间,实际上可以扩展到对应一段前缀
这样子,只需要一个主席树就可以做到了
复杂度$O(n \log n)$
- #include <map>
- #include <queue>
- #include <vector>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- namespace remoon {
- #define ri register int
- #define tpr template <typename ra>
- #define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)
- #define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --)
- #define gc getchar
- inline int read() {
- int p = , w = ; char c = gc();
- while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
- while(c >= '' && c <= '') p = p * + c - '', c = gc();
- return p * w;
- }
- int wr[], rw;
- #define pc(iw) putchar(iw)
- tpr inline void write(ra o, char c = '\n') {
- if(!o) pc('');
- if(o < ) o = -o, pc('-');
- while(o) wr[++ rw] = o % , o /= ;
- while(rw) pc(wr[rw --] + '');
- pc(c);
- }
- tpr inline void cmin(ra &a, ra b) { if(a > b) a = b; }
- tpr inline void cmax(ra &a, ra b) { if(a < b) a = b; }
- tpr inline bool ckmin(ra &a, ra b) { return (a > b) ? a = b, : ; }
- tpr inline bool ckmax(ra &a, ra b) { return (a < b) ? a = b, : ; }
- }
- using namespace std;
- using namespace remoon;
- #define sid 300050
- #define oid 12050000
- int dfn[sid], sz[sid];
- int n, r, m, id, tim, cnp, mxd;
- int rt[sid], nxt[sid], node[sid], cap[sid];
- int fa[sid], q[sid], w[sid], dep[sid];
- int ls[oid], rs[oid], miv[oid];
- inline void addedge(int u, int v) {
- nxt[++ cnp] = cap[u]; cap[u] = cnp; node[cnp] = v;
- }
- #define cur node[i]
- inline void dfs(int o, int f) {
- fa[o] = f; dep[o] = dep[f] + ;
- sz[o] = ; dfn[o] = ++ tim;
- for(int i = cap[o]; i; i = nxt[i])
- if(cur != f) dfs(cur, o), sz[o] += sz[cur];
- }
- inline void insert(int &now, int pre, int l, int r, int p, int v) {
- now = ++ id;
- ls[now] = ls[pre]; rs[now] = rs[pre];
- miv[now] = min(miv[pre], v);
- if(l == r) return;
- int mid = (l + r) >> ;
- if(p <= mid) insert(ls[now], ls[pre], l, mid, p, v);
- else insert(rs[now], rs[pre], mid + , r, p, v);
- }
- inline void build() {
- int fr = , to = ;
- q[++ to] = r; miv[] = 1e9;
- while(fr <= to) {
- int o = q[fr];
- for(ri i = cap[o]; i; i = nxt[i])
- if(cur != fa[o]) q[++ to] = cur;
- if(dep[o] != dep[q[fr - ]])
- insert(rt[dep[o]], rt[dep[o] - ], , n, dfn[o], w[o]);
- else insert(rt[dep[o]], rt[dep[o]], , n, dfn[o], w[o]);
- fr ++; cmax(mxd, dep[o]);
- }
- }
- inline int qry(int o, int l, int r, int ml, int mr) {
- if(ml > r || mr < l || !o) return 1e9;
- if(ml <= l && mr >= r) return miv[o];
- int mid = (l + r) >> ;
- return min(qry(ls[o], l, mid, ml, mr), qry(rs[o], mid + , r, ml, mr));
- }
- int main() {
- n = read(); r = read();
- rep(i, , n) w[i] = read();
- rep(i, , n) {
- int u = read(), v = read();
- addedge(u, v); addedge(v, u);
- }
- dfs(r, ); build();
- int lst = ; m = read();
- rep(i, , m) {
- int x = (read() + lst) % n + ;
- int k = (read() + lst) % n;
- write(lst = qry(rt[min(dep[x] + k, mxd)], , n, dfn[x], dfn[x] + sz[x] - ));
- }
- return ;
- }
CF893F Subtree Minimum Query 主席树的更多相关文章
- EC Round 33 F. Subtree Minimum Query 主席树/线段树合并
这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...
- CF893F:Subtree Minimum Query(线段树合并)
Description 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值.(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) Input 第一行 ...
- CF893F Subtree Minimum Query 解题报告
CF893F Subtree Minimum Query 输入输出格式 输入格式: The first line contains two integers \(n\) and \(r\) ( \(1 ...
- [CF893F] Subtree Minimum Query
Description: 给定一棵树,每次询问某点子树中到其不超过k的所有点的最小点权 强制在线 Hint: \(n,m\le 10^5\) Solution: 看到题目第一反应是以深度为下标,dfs ...
- Codeforces 893F - Subtree Minimum Query
893F - Subtree Minimum Query 题意 给出一棵树,每次询问 \(x\) \(k\),求以 \(x\) 为根结点的子树中的结点到结点 \(x\) 的距离小于等于 \(k\) 的 ...
- [cf contest 893(edu round 33)] F - Subtree Minimum Query
[cf contest 893(edu round 33)] F - Subtree Minimum Query time limit per test 6 seconds memory limit ...
- Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...
- 2019.01.19 codeforces893F.Subtree Minimum Query(线段树合并)
传送门 线段树合并菜题. 题意简述:给一棵带点权的有根树,多次询问某个点ppp子树内距离ppp不超过kkk的点的点权最小值,强制在线. 思路: 当然可以用dfsdfsdfs序+主席树水过去. 然而线段 ...
- Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)
题意 给定一棵 \(n\) 个点的带点权树,以 \(1\) 为根, \(m\) 次询问,每次询问给出两个值 \(p, k\) ,求以下值: \(p\) 的子树中距离 \(p \le k\) 的所有点权 ...
随机推荐
- 凸包入门(Graham扫描法)(A - Wall POJ - 1113)
题目链接:https://cn.vjudge.net/contest/276359#problem/A 题目大意:有一个国王,要在自己的城堡周围建立围墙,要求围墙能把城堡全部围起来,并且围墙距离城堡的 ...
- XSS练习小游戏和答案参考
源码:https://files.cnblogs.com/files/Eleven-Liu/xss%E7%BB%83%E4%B9%A0%E5%B0%8F%E6%B8%B8%E6%88%8F.zip 感 ...
- 88.modelsim仿真do文件相关技巧
网上的关于DO文件的编写好像资料不多,比较杂,所以本人总结一下常用的简单语法,方便大家查看.其实本人也刚接触DO文件没多久,有纰漏很正常,欢迎指正批评,互相学习.PS:写得有点乱 还有一个值得注意 ...
- 工作常用shell集合
<1>日志回滚案例======>[root@localhost test]# cat hbase.sh hbase_rotate_log () { log=$1; ...
- 十五、springboot集成定时任务(Scheduling Tasks)(二)之(线程配置)
配置类: /** * 定时任务线程配置 * */ @Configuration public class SchedulerConfig implements SchedulingConfigurer ...
- python网络编程-进程间数据通信(Queue,Pipe ,managers)
一:进程间数据交换方法 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queue,Pipe ,managers 1)Queue,使用方法跟threading里的queue差 ...
- Java KeyStore 用命令生成keystore文件自己生成证书,简介
1.生成keyStore文件 在命令行下执行以下命令: Shell代码 收藏代码 keytool -genkey -validity 36000 -alias www.zlex.org -keyalg ...
- Selenium_多线程执行测试用例
多线程执行测试用例 这里以百度搜索为例,通过不同的浏览器来启动不同的线程. #!/usr/bin/env python # _*_ coding:utf-8 _*_ __author__ = 'Yin ...
- CxGrid 表格列内容居中
首先每一列 Cxgrid 都不知道要当成什么来出来,所以每一列都有个properties 让你来设置,告诉cxgrid 这列的内容是什么,然后根据你给出的内容 再来决定用什么居中方式: 就是说 官方再 ...
- RobotCraft 2017 第二届国际机器人学暑期学校 2nd Edition of International Robotics Summer School
原文网址:http://www.ros.org/news/2017/02/2nd-edition-of-international-robotics-summer-school-robotcraft- ...