2019.01.19 codeforces893F.Subtree Minimum Query(线段树合并)
传送门
线段树合并菜题。
题意简述:给一棵带点权的有根树,多次询问某个点ppp子树内距离ppp不超过kkk的点的点权最小值,强制在线。
思路:
当然可以用dfsdfsdfs序+主席树水过去。
然而线段树合并也是一个不错&&好写的思路
我们按照深度为下标建立权值线段树然后线段树合并预处理一波。
查询就转化成区间查询了。
注意因为要保存下每一个子树的信息所以合并的时候要新建节点来储存信息。
代码:
#include<bits/stdc++.h>
#define ri register int
#define lc (son[p][0])
#define rc (son[p][1])
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=1e5+5;
int n,m,tot=0,Rt,dep[N],mxdep=0,rt[N],mn[N*50],son[N*50][2],a[N];
vector<int>e[N];
inline void build(int&p,int l,int r,int k,int v){
mn[p=++tot]=v,lc=rc=0;
if(l==r)return;
int mid=l+r>>1;
k<=mid?build(lc,l,mid,k,v):build(rc,mid+1,r,k,v);
}
inline int merge(int x,int y,int l,int r){
if(!x||!y)return x+y;
int ret=++tot;
mn[ret]=min(mn[x],mn[y]);
if(l==r)return ret;
int mid=l+r>>1;
son[ret][0]=merge(son[x][0],son[y][0],l,mid);
son[ret][1]=merge(son[x][1],son[y][1],mid+1,r);
return ret;
}
inline int query(int p,int l,int r,int ql,int qr){
if(!p||ql>r||qr<l)return 0x3f3f3f3f;
if(ql<=l&&r<=qr)return mn[p];
int mid=l+r>>1;
if(qr<=mid)return query(lc,l,mid,ql,qr);
if(ql>mid)return query(rc,mid+1,r,ql,qr);
return min(query(lc,l,mid,ql,mid),query(rc,mid+1,r,mid+1,qr));
}
void dfs(int p,int fa){mxdep=max(mxdep,dep[p]=dep[fa]+1);for(ri i=0,v;i<e[p].size();++i)if((v=e[p][i])^fa)dfs(v,p);}
void Dfs(int p,int fa){
build(rt[p],1,mxdep,dep[p],a[p]);
for(ri i=0,v;i<e[p].size();++i)if((v=e[p][i])^fa)Dfs(v,p),rt[p]=merge(rt[p],rt[v],1,mxdep);
}
int main(){
n=read(),Rt=read();
for(ri i=1;i<=n;++i)a[i]=read();
for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
dfs(Rt,0),Dfs(Rt,0),m=read();
for(ri i=1,p,k,lastans=0;i<=m;++i)p=(read()+lastans)%n+1,k=(read()+lastans)%n,cout<<(lastans=query(rt[p],1,mxdep,dep[p],min(dep[p]+k,mxdep)))<<'\n';
return 0;
}
2019.01.19 codeforces893F.Subtree Minimum Query(线段树合并)的更多相关文章
- CF893F:Subtree Minimum Query(线段树合并)
Description 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值.(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) Input 第一行 ...
- EC Round 33 F. Subtree Minimum Query 主席树/线段树合并
这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...
- 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)
传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...
- 2019.01.04 bzoj2962: 序列操作(线段树+组合数学)
传送门 线段树基础题. 题意:要求维护区间区间中选择ccc个数相乘的所有方案的和(c≤20c\le20c≤20),支持区间加,区间取负. 由于c≤20c\le20c≤20,因此可以对于每个线段树节点可 ...
- 2019.01.16 bzoj3526: [Poi2014]Card(线段树)
传送门 线段树菜题. 题意:有一些卡牌,正反各有一个数,你可以任意翻转,每次操作会将两张卡牌的位置调换,你需要在每次操作后回答以现在的卡牌顺序能否通过反转形成一个单调不降的序列. 思路: 对于一个线段 ...
- 2019.01.22 51nod 1203 JZPLCM(线段树+链表)
传送门 一道很有意思的题. 题意简述:给一个数列,多次询问区间的lcmlcmlcm,答案对1e9+71e9+71e9+7取模. 思路:首先考虑到一个区间的lcmlcmlcm就是其中所有出现过的素数的最 ...
- CF893F Subtree Minimum Query 主席树
如果是求和就很好做了... 不是求和也无伤大雅.... 一维太难限制条件了,考虑二维限制 一维$dfs$序,一维$dep$序 询问$(x, k)$对应着在$dfs$上查$[dfn[x], dfn[x] ...
- Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...
- 2019.01.19 bzoj5457: 城市(线段树合并)
传送门 线段树合并菜题. 题意简述:给一棵树,每个节点有bib_ibi个aia_iai民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...
随机推荐
- Android 单元测试四大组件Activity,Service,Content Provider , Broadcast Receiver
先mark, 后补充 https://blog.csdn.net/stevenhu_223/article/details/14054313 https://www.jianshu.com/p/3aa ...
- TOJ 4976: 新生数(深搜)
传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4976 时间限制(普通/Java): ...
- Linux基石【第三篇】vim提示-bash:vim :common not found解决方法
在Linux命令行输入vim时提示:-bash:vim :common not found,之后按着查询到的解决办法整好了: 解决步骤如下: 1.输入 rpm -qa|grep vim 命令,查看返回 ...
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- Xcode 去掉控制台无用打印信息
1. 2.在Environment Variables增加一键值对 OS_ACTIVITY_MODE = disable 转自:https://blog.csdn.net/HelloWorld_198 ...
- HttpClient上传文件
1.上传客户端代码: public static void upload() { CloseableHttpClient httpclient = HttpClients.createDefault( ...
- js学习(初)
一种弱数据类型语言 var 基础: 处理字符串的函数 数组基础操作 流程控制语句 选择,分支 循环for for in for(索引变量 in 对象){ 语句块 } 面向对象: js语言的对象就是 ...
- webpack.dev.conf.js
var utils = require('./utils')var webpack = require('webpack')var config = require('../config') // 一 ...
- ios简单国际化
1.在PROJECT中Info得Localizations中添加语言 2.新建Localizable.strings(一定是这个文件名),在右侧属性栏的Localization中勾选出你需要的语言 3 ...
- 在textarea中鼠标指定的位置插入字符或表情
有些时候我们已经在textarea中输入了一些字符,然后想在鼠标指定的位置插入表情或者字符,这就需要用到jquery的一个小插件了. 代码如下: (function ($) { $.fn.extend ...