893F - Subtree Minimum Query

题意

给出一棵树,每次询问 \(x\) \(k\),求以 \(x\) 为根结点的子树中的结点到结点 \(x\) 的距离小于等于 \(k\) 的结点权值最小值。

分析

可持久化线段树,对每个结点都建树,然后尽可能复用子孙结点的线段树。

对于一般的线段树,我们并不需要记录左右子结点的标号,因为如果当前节点标号为 \(rt\) ,则左右子结点标号为 \(2 * rt\) 和 \(2 * rt + 1\) 。对于本题,若有 \(u\) 是 \(v\) 的父亲,那么理论上 \(u\) 在 \(v\) 所建好的线段树的基础上只会影响一条链的结点,为保证不影响在 \(v\) 结点建好的线段树,对于产生影响的结点我们新建一个结点,并设置左右子结点,对于其它的结点,我们都可以复用,即将左右子结点直接指向已经建好的线段树的结点即可。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 2e9 + 10;
int a[N], sz, rot[N * 50], dep[N];
struct node {
int l, r, val;
void init() { l = r = 0; val = INF; }
}nd[N * 50]; vector<int> G[N]; void update(int p, int val, int l, int r, int &rt) {
nd[rt = ++sz].init();
nd[rt].val = min(nd[rt].val, val);
if(l != r) {
int m = l + r >> 1;
if(p <= m) update(p, val, l, m, nd[rt].l);
else update(p, val, m + 1, r, nd[rt].r);
nd[rt].val = min(nd[nd[rt].l].val, nd[nd[rt].r].val);
}
} int query(int L, int R, int l, int r, int rt) {
if(L <= l && R >= r) return nd[rt].val;
int m = l + r >> 1;
int res = INF;
if(L <= m) res = query(L, R, l, m, nd[rt].l);
if(R > m) res = min(res, query(L, R, m + 1, r, nd[rt].r));
return res;
} int mergeUp(int u, int v) {
if(!u) return v;
if(!v) return u;
int t = ++sz;
nd[t].init();
nd[t].l = mergeUp(nd[u].l, nd[v].l);
nd[t].r = mergeUp(nd[u].r, nd[v].r);
nd[t].val = min(nd[u].val, nd[v].val);
return t;
} void dfs(int fa, int u) {
dep[u] = dep[fa] + 1;
update(dep[u], a[u], 1, N, rot[u]);
for(int v : G[u]) {
if(v != fa) {
dfs(u, v);
rot[u] = mergeUp(rot[u], rot[v]);
}
}
} int main() {
nd[0].init();
int n, r;
scanf("%d%d", &n, &r);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for(int i = 1; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(0, r);
int q, lst = 0;
scanf("%d", &q);
while(q--) {
int x, k, b, c;
scanf("%d%d", &b, &c);
x = ((b + lst) % n) + 1;
k = (c + lst) % n;
lst = query(dep[x], min(dep[x] + k, N), 1, N, rot[x]);
printf("%d\n", lst);
}
return 0;
}

Codeforces 893F - Subtree Minimum Query的更多相关文章

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

  2. CF893F Subtree Minimum Query 解题报告

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

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

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

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

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

  5. [CF893F] Subtree Minimum Query

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

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

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

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

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

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

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

  9. CF893F Subtree Minimum Query 主席树

    如果是求和就很好做了... 不是求和也无伤大雅.... 一维太难限制条件了,考虑二维限制 一维$dfs$序,一维$dep$序 询问$(x, k)$对应着在$dfs$上查$[dfn[x], dfn[x] ...

随机推荐

  1. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  2. 基于 HTML5 WebGL 的 3D 服务器与客户端的通信

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算 ...

  3. mongodb副本集配置

    需要用到mongodb的时候单个实例肯定是不行的,挂了怎么办,那然后呢,跟mysql一样搞主从备份吗,是可以的mongodb这么弄,不过官网已经不推荐了这么干了,推荐使用副本集的模式,然后数据再大一点 ...

  4. 安装eclipse时跳转到网页提示JRE Missing

    可能的原因:jdk与安装的eclipse不兼容,可能64位机器安装了32位的jdk,导致64位的eclipse不能识别.

  5. Docker Stack 集群部属服务

    Docker越来越成熟,功能也越来越强大.使用Dokcer Stack做服务集群也是非常的方便,docker 自己就提供了负载功能,感觉很方便,就想给大家分享一下,做一个简单的教程. 环境 我是用了两 ...

  6. ls /proc/$$,self/fd/3,255 引发的一些琐事

    我在使用bash的时候通常会利用它的自动补全功能来看看文件夹下的内容(连按两下Tab键),例如: 说明Music文件夹下有这三个文件,我也就不需要提前用ls命令来确定了. 但是最近我在查看当前shel ...

  7. ActiveMQ (一) 初识ActiveMQ

    了解JMS JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进 ...

  8. 用python在excel中读取与生成随机数写入excel中

    今天是我第一次发博客,就关于python在excel中的应用作为我的第一篇吧. 具体要求是:在一份已知的excel表格中读取学生的学号与姓名,再将这些数据放到新的excel表中的第一列与第二列,最后再 ...

  9. MyBatis小抄

    持续更新中. Every MyBatis application centers around an instance of SqlSessionFactory A cleaner approch t ...

  10. JMeter数据库操作详解

    Jmeter提供了JDBC连接的插件,通过执行SQL语句的java API,实现对数据库的访问和查询,同时可以操作一次向数据库插入上百条上千条数据. 一.安装驱动包 将需要连接JDBC的jar包放入j ...