如果是求和就很好做了...

不是求和也无伤大雅....

一维太难限制条件了,考虑二维限制

一维$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 主席树的更多相关文章

  1. EC Round 33 F. Subtree Minimum Query 主席树/线段树合并

    这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...

  2. CF893F:Subtree Minimum Query(线段树合并)

    Description 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值.(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) Input 第一行 ...

  3. CF893F Subtree Minimum Query 解题报告

    CF893F Subtree Minimum Query 输入输出格式 输入格式: The first line contains two integers \(n\) and \(r\) ( \(1 ...

  4. [CF893F] Subtree Minimum Query

    Description: 给定一棵树,每次询问某点子树中到其不超过k的所有点的最小点权 强制在线 Hint: \(n,m\le 10^5\) Solution: 看到题目第一反应是以深度为下标,dfs ...

  5. Codeforces 893F - Subtree Minimum Query

    893F - Subtree Minimum Query 题意 给出一棵树,每次询问 \(x\) \(k\),求以 \(x\) 为根结点的子树中的结点到结点 \(x\) 的距离小于等于 \(k\) 的 ...

  6. [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 ...

  7. Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)

    题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...

  8. 2019.01.19 codeforces893F.Subtree Minimum Query(线段树合并)

    传送门 线段树合并菜题. 题意简述:给一棵带点权的有根树,多次询问某个点ppp子树内距离ppp不超过kkk的点的点权最小值,强制在线. 思路: 当然可以用dfsdfsdfs序+主席树水过去. 然而线段 ...

  9. Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)

    题意 给定一棵 \(n\) 个点的带点权树,以 \(1\) 为根, \(m\) 次询问,每次询问给出两个值 \(p, k\) ,求以下值: \(p\) 的子树中距离 \(p \le k\) 的所有点权 ...

随机推荐

  1. javascript 中的类数组和数组

    什么是类数组呢? 我们先来看一段代码: function fn() { console.dir(arguments); } fn(1,2,3,4,5,6,7,8,9,10); 这段代码的执行后,在 c ...

  2. H5 键盘兼容性小结

    H5 键盘兼容性小结 在 H5 项目中,我们会经常遇到页面中存在单个甚至多个 input/textarea 输入框与底部固定元素的布局情况.在 input/textarea 输入框获取焦点时,会自动触 ...

  3. JS设计模式——9.组合模式

    组合模式概述 组合模式是一种专为创建Web上的动态用户界面量身定制的模式.使用这种模式可以用一条命令在多个对象上激发复杂的递归的行为. 它可以用来把一批子对象组织成树形结构,并且使整棵树都可被遍历.所 ...

  4. jQuery文档处理(追加删除)——(三)

    1.追加内容

  5. linux服务器登录时慢出现卡顿

    使用SSH远程登录Linux在输入用户名之后在过了好几秒之后才会出现输入密码.严重影响工作效率.登录很慢,登录上去后速度正常,这种情况的主要原因为: DNS反向解析的问题 SSH在登录的时候一般我们输 ...

  6. TF-搞不懂的TF矩阵加法

    看谷歌的demo mnist,卷积后加偏执量的代码 h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)h_pool1 = max_pool ...

  7. 练习题 --- 写出5种css定位语法

    写出至少5种css语法(每种语法不一样)

  8. JS实现幸运抽奖页面

    JS实现简单的幸运抽奖页面 效果图: 图片素材 : 代码如下,复制即可使用: <!DOCTYPE html> <html> <head lang="en&quo ...

  9. python类、类继承

    yield: 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab( ...

  10. C#基础系列 - 反射基础

    反射用于在程序运行过程中,获取类里面的信息或发现程序集并运行的一个过程.通过反射可以获得.dll和.exe后缀的程序集里面的信息.使用反射可以看到一个程序集内部的类,接口,字段,属性,方法,特性等信息 ...