Description

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

Input

第一行两个数,为点数$n$和树根$r$。
第二行$n$个数,为每个点的权值。
后面$n-1$行给出树边
再一行$m$,后面给出$m$组询问。

Output

一行答案。

Sample Input

5 2
1 3 2 3 5
2 3
5 1
3 4
4 1
2
1 2
2 3

Sample Output

2

5

Solution

线段树合并板子题。注意数组大小QAQ我老是开小$RE$……

感觉$Slr$和$beretty$两个人数据结构学傻了用了另一个题非常麻烦的做法写的这个题……

Code

 #include<iostream>
#include<cstdio>
#define N (100009)
using namespace std; struct Sgt{int ls,rs,min;}Segt[N<<];
struct Edge{int to,next;}edge[N<<];
int n,m,sgt_num,ans,lastans,u,v,p,q,r;
int a[N],Root[N],Depth[N];
int head[N],num_edge; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Update(int &now,int l,int r,int x,int v)
{
if (!now) now=++sgt_num;
Segt[now].min=2e9;
if (l==r) {Segt[now].min=v; return;}
int mid=(l+r)>>;
if (x<=mid) Update(Segt[now].ls,l,mid,x,v);
else Update(Segt[now].rs,mid+,r,x,v);
int ls=Segt[now].ls, rs=Segt[now].rs;
Segt[now].min=min(Segt[ls].min,Segt[rs].min);
} int Merge(int x,int y)
{
if (!x || !y) return x|y;
int tmp=++sgt_num;
Segt[tmp].ls=Merge(Segt[x].ls,Segt[y].ls);
Segt[tmp].rs=Merge(Segt[x].rs,Segt[y].rs);
Segt[tmp].min=min(Segt[x].min,Segt[y].min);
return tmp;
} void DFS(int x,int fa)
{
Depth[x]=Depth[fa]+;
Update(Root[x],,n,Depth[x],a[x]);
for (int i=head[x]; i; i=edge[i].next)
if (edge[i].to!=fa)
{
DFS(edge[i].to,x);
Root[x]=Merge(Root[x],Root[edge[i].to]);
}
} int Query(int now,int l,int r,int l1,int r1)
{
if (l>r1 || r<l1) return 2e9;
if (l1<=l && r<=r1) return Segt[now].min;
int mid=(l+r)>>, ls=Segt[now].ls, rs=Segt[now].rs;
return min(Query(ls,l,mid,l1,r1),Query(rs,mid+,r,l1,r1));
} int main()
{
Segt[].min=2e9;
scanf("%d%d",&n,&r);
for (int i=; i<=n; ++i)
scanf("%d",&a[i]);
for (int i=; i<=n-; ++i)
{
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
DFS(r,);
scanf("%d",&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d",&p,&q);
p=(p+lastans)%n+; q=(q+lastans)%n;
ans=Query(Root[p],,n,Depth[p],Depth[p]+q);
printf("%d\n",ans); lastans=ans;
}
}

CF893F:Subtree Minimum Query(线段树合并)的更多相关文章

  1. CF893F Subtree Minimum Query 主席树

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

  2. CF893F Subtree Minimum Query 解题报告

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

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

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

  4. [CF893F] Subtree Minimum Query

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

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

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

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

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

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

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

  8. hdu 5511 Minimum Cut-Cut——分类讨论思想+线段树合并

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5511 题意:割一些边使得无向图变成不连通的,并且恰好割了两条给定生成树上的边.满足非树边两段一定在给定生成 ...

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

随机推荐

  1. Winform 常用的方法

    一,Winform 如何内嵌窗体 1,判断窗体中是否以还有内嵌窗体 private void ClosePreForm() { foreach (Control item in this.spCont ...

  2. 线程5--GCD简介

    /******************************************************/  同步函数  (1)并发队列:不会开线程  (2)串行队列:不会开线程  异步函数   ...

  3. Nginx面试

    声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话 1.请解释一下什么是 Nginx? Nginx是一个 web服务器和反向代理服务器,用于 HTTP.H ...

  4. 微服务与DevOps关系

    随着IT技术的不断发展,从传统的IT建设模型逐步向新型IT建设模型过渡,建设模式的改变,必然影响应用系统的全生命周期.应用系统的建设经过单体应用.SOA应用.逐步走向微服务应用,至于何为单体应用.SO ...

  5. ef oracle参数化问题

    并非所有变量都已绑定 假如一个sql是这样的 string sql =@" select id from a where date between :StartDate and :EndDa ...

  6. 聊聊MyBatis缓存机制【美团-推荐】

    聊聊MyBatis缓存机制 2018年01月19日 作者: 凯伦 文章链接 18778字 38分钟阅读 前言 MyBatis是常见的Java数据库访问层框架.在日常工作中,开发人员多数情况下是使用My ...

  7. 视区相关单位vw, vh..简介以及可实际应用场景——张鑫旭

    一.N多的唠哩唠叨 CSS3中一些新的单位早在去年春暖花开的时候就介绍了,参见:CSS长度值及时间.频率.角度单位.显然,其中就提到了本文要感叹的单位vw, vh,见下图: 不过“我看见你”和“我触碰 ...

  8. 【代码笔记】iOS-左右可滑动的选择条

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  9. 润乾V5手机报表说明文档

    1.手机报表实例页面简要说明 index.jsp 是报表资源列表页面: mbReport.jsp 是报表展现页面: mbParam.jsp是参数报表展现页面: echarts.jsp是带有echart ...

  10. 【Java】函数使用

    package aaa; public class aaa { public static int add(int a,int b) { return a+b; } public static voi ...