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民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...
随机推荐
- js 计算丢失精度问题
计算时用parseFloat,计算完后转换成Number对象 var ytje = parseFloat("0.03"); var handlecharge = parseFloa ...
- rear
rear - 必应词典 美[rɪr]英[rɪə(r)] v.抚养:养育:饲养:培养 n.屁股:后部:臀部 adj.后面的:后部的 网络背面:后方:后轮 变形过去分词:reared:现在分词:reari ...
- .linearDrag on rigidbody / rigidbody2D in code?
it's rigidbody.drag not .linearDrag 这几天在做一个弹球的游戏,发现小球落下后不会自动停,测试后发现线性阻尼增加后可以 于是加了个触发器不停增加线性阻尼值 priva ...
- swift - 解析三方 - ObjectMapper
// // JYQueryBespeakModel.swift // rtb // // Created by chen on 2018/3/30 // 查询预约信息 import UIKit imp ...
- 页面练习my blog day51
html端: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Linux pip安装使用详解
简介 pip是Python有它自己的包管理工具,与yum和apt-get相似. 安装步骤: 1.下载get-pip.py:https://bootstrap.pypa.io/get-pip.py 2. ...
- 公共的service接口
package com.taotao.manager.service; import java.util.List; /** * @author Administrator * * @param &l ...
- PAT 1028 人口普查(20)(STL-set+思路+测试点分析)
1028 人口普查(20)(20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超 ...
- Activity2.java
package com.hanqi.text3; import android.app.Activity; import android.os.Bundle; import android.os.Pe ...
- TP 真阳性 TN FP FN
TP.True Positive 真阳性:预测为正,实际也为正 FP.False Positive 假阳性:预测为正,实际为负 FN.False Negative 假阴性:预测与负.实际为正 T ...