Codeforces893F_Subtree Minimum Query
题意
给定一棵树和根,每个点有点权,强制在线询问\(x\)子树里离\(x\)距离不超过\(k\)的最小点权。
分析
- 权值线段树合并的套路题,dfs,以深度作为下标,点权作为值,对每个点建立一颗权值线段树,然后回溯的时候合并到父节点的线段树上。
- 合并时维护最小值,查询时也是查询区间最小值。
- 内存给得多的情况下数组往死里开,不要白白送一发RE。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+50;
const int INF=0x3f3f3f3f;
vector<int> g[N];
int a[N],n,rt,u,v,lst,q,x,k;
int mn[N*30],ls[N*30],rs[N*30],tot,dep[N],tr[N];
void insert(int &rt,int l,int r,int p,int v){
if(!rt){
rt=++tot;
}
mn[rt]=v;
int mid=(l+r)/2;
if(l<r){
if(p<=mid){
insert(ls[rt],l,mid,p,v);
}else{
insert(rs[rt],mid+1,r,p,v);
}
}
}
int merge(int a,int b){
if(!a || !b){
return a+b;
}
int rt=++tot;
mn[rt]=min(mn[a],mn[b]);
ls[rt]=merge(ls[a],ls[b]);
rs[rt]=merge(rs[a],rs[b]);
return rt;
}
int query(int rt,int l,int r,int ql,int qr){
if(!rt){
return INF;
}
if(ql<=l && qr>=r){
return mn[rt];
}
int ans=INF;
int mid=(l+r)/2;
if(ql<=mid){
ans=min(ans,query(ls[rt],l,mid,ql,qr));
}
if(qr>mid){
ans=min(ans,query(rs[rt],mid+1,r,ql,qr));
}
return ans;
}
void debug(int rt,int l,int r){
printf("%d %d %d\n",l,r,mn[rt]);
if(l==r){
return;
}
int mid=(l+r)/2;
debug(ls[rt],l,mid);
debug(rs[rt],mid+1,r);
}
void dfs(int u,int f){
dep[u]=dep[f]+1;
insert(tr[u],1,n,dep[u],a[u]);
int siz=g[u].size();
for(int i=0;i<siz;i++){
int v=g[u][i];
if(v==f){
continue;
}
dfs(v,u);
tr[u]=merge(tr[u],tr[v]);
}
}
int solve(int x,int k){
return query(tr[x],1,n,dep[x],dep[x]+k);
}
int main(){
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&rt);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(rt,0);
scanf("%d",&q);
while(q--){
scanf("%d%d",&x,&k);
x=(x+lst)%n+1;
k=(k+lst)%n;
printf("%d\n",lst=solve(x,k));
}
return 0;
}
Codeforces893F_Subtree Minimum Query的更多相关文章
- AOJ DSL_2_A Range Minimum Query (RMQ)
Range Minimum Query (RMQ) Write a program which manipulates a sequence A = {a0,a1,...,an−1} with the ...
- Range Minimum Query and Lowest Common Ancestor
作者:danielp 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAnc ...
- 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 ...
- 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 ...
- Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)
题意 给定一棵 \(n\) 个点的带点权树,以 \(1\) 为根, \(m\) 次询问,每次询问给出两个值 \(p, k\) ,求以下值: \(p\) 的子树中距离 \(p \le k\) 的所有点权 ...
- 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序+主席树水过去. 然而线段 ...
随机推荐
- kali修改更新源及更新
进入源文件进行修改 leafpad /etc/apt/sources.list (其实系统本身就自带了更新源,去掉其注释也是可以的,现在官方源的下载速度也还ok,下面的三选一亦可) #kali官方源 ...
- Linux系统下MySql表名大小写敏感问题
mysql是通过lower_case_table_names变量来处理大小写问题的. 首先查询该变量 mysql在Linux下数据库名.表名.列名.表别名大小写规则如下: 1.数据库名与表名严格区分大 ...
- 查看线程的cpu占用率
1) top -H -p 进程pid 查看线程的线程ID与CPU占用情况.或者使用 ps -eLo pid,lwp,pcpu | grep 进程pid2) pstack ...
- 2018-2019-2 20175215 实验一《Java开发环境的熟悉》实验报告
一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 cd code进入code文件夹 mkdir 20175215exp1创建20175215exp1文件夹 ls查看当前目录 cd 201 ...
- Cassandra 如何处理跨数据中心的数据库延时问题
分布式系统的可靠.延时.一致性等问题是一般性问题,不局限于数据库,而Cassandra提供了一个很好的解决思路. Cassandra号称能做到跨数据中心的数据库访问的高效访问,它的实现方式其实是把延时 ...
- 全面解读php-php会话控制技术
一.PHP会话控制技术 1.为什么要使用会话控制技术? 因为http协议是无状态协议,所以同一个用户在请求同一个页面两次的时候,http协议不会认为这两次请求都来自于同一个用户,会把它们当做是两次请求 ...
- Emacs Python 自动补全之 eglot
eglot 个人水平有限,自己的测试难免有不足甚至错误的地方.欢迎各位emacser 能前来留言交流. 首先eglot 是一个lsp-mode的集成环境.作者说这不仅仅是一个lsp工具.但是我从其说明 ...
- shell命令find删除修改后带尾巴的重复的文件
命令:find . -name "*~" -delete 说明:在linux中 点号(.)表示当前目录,连续的连个点号(..)表示父级目录 作用:在linux中,我经常会遇到这样的 ...
- Object Creation
Although using the object constructor or an object literal are convenient ways to create single obje ...
- SQLALchemy如何查询mysql某个区间内的数据
查了下,找到3种方式: 方法一注意时间格式:xxxx-xx-xx 方法二没有‘day’ 方法三的时间格式同方法一 1.result = Jobs.query.filter(Jobs.create_ti ...