解题关键:dfs序将树映射到区间,然后主席树求区间第k小,为模板题。

 #pragma comment(linker, "/STACK:1024000000,1024000000") `
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<vector>
typedef long long ll;
using namespace std;
const int maxn=1e5+;
int head[maxn],in[maxn],out[maxn],cnt,num;
int b[maxn],va[maxn];
int n,m;
struct Edge{
int to,nxt;
}e[maxn<<];
int root[maxn];
struct node{
int l,r,sum;
}p[maxn*]; inline int read(){
char k=;char ls;ls=getchar();for(;ls<''||ls>'';k=ls,ls=getchar());
int x=;for(;ls>=''&&ls<='';ls=getchar())x=(x<<)+(x<<)+ls-'';
if(k=='-')x=-x;return x;
} void add_edge(int u,int v){
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt++;
} void dfs(int u,int fa){
num++;
b[num]=va[u];
in[u]=num;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==fa) continue;
dfs(v,u);
}
out[u]=num;
} int build(int l,int r){
int rt=++cnt;
p[rt].sum=;
p[rt].l=p[rt].r=;
if(l==r) return rt;
int mid=(l+r)>>;
p[rt].l=build(l,mid);
p[rt].r=build(mid+,r);
return rt;
} int update(int l,int r,int c,int k){
int nc=++cnt;
p[nc]=p[c];
p[nc].sum++;
int mid=(l+r)>>;
if(l==r) return nc;
if(mid>=k) p[nc].l=update(l,mid,p[c].l,k);
else p[nc].r=update(mid+,r,p[c].r,k);
return nc;
} int query(int l,int r,int x,int y,int k){
if(l==r) return l;
int mid=(l+r)>>;
int sum=p[p[y].l].sum-p[p[x].l].sum;
if(sum>=k) return query(l,mid,p[x].l,p[y].l,k);
else return query(mid+,r,p[x].r,p[y].r,k-sum);
}
vector<int>v;
int getid(int x){
return int(lower_bound(v.begin(),v.end(),x)-v.begin())+;
} int main(){
while(scanf("%d",&n)!=EOF){
v.clear();
memset(head,-,sizeof head);
cnt=;
num=;
for(int i=;i<=n;i++) va[i]=read();
for(int i=;i<n-;i++){
int t1,t2;
t1=read();
t2=read();
add_edge(t1,t2);
add_edge(t2,t1);
}
dfs(,-);
for(int i=;i<=n;i++) v.push_back(b[i]);
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()),v.end());
root[]=build(,n);
for(int i=;i<=n;i++) root[i]=update(,n,root[i-],getid(b[i]));
int c,d;
m=read();
for(int i=;i<m;i++){
c=read();
d=read();
int ans=query(,n,root[in[c]-],root[out[c]],d);
printf("%d\n",v[ans-]);
}
}
return ;
}

[xdoj1216]子树第k小(dfs序+主席树)的更多相关文章

  1. 2018.09.30 bzoj3551:Peaks加强版(dfs序+主席树+倍增+kruskal重构树)

    传送门 一道考察比较全面的题. 这道题又用到了熟悉的kruskal+倍增来查找询问区间的方法. 查到询问的子树之后就可以用dfs序+主席树统计答案了. 代码: #include<bits/std ...

  2. 【bzoj1803】Spoj1487 Query on a tree III DFS序+主席树

    题目描述 You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node w ...

  3. 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树

    bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...

  4. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  5. bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

  6. BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)

    题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...

  7. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  8. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  9. BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)

    背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了... 描述 ...

随机推荐

  1. 【PHP开发】远程文件(图片)下载

    这一篇文章介绍的方法不算原创了,只是引用的别人的文章,加上自己的注释,因为接触php时间不长,所以尝试的东西比较多,自己加的注释也比较简单,php高手请略过. 我要用到远程下载图片,是在做微信公众平台 ...

  2. Unity3D 动态地创建识别图

    前面介绍了EasyAR的单图识别,它是提前在Unity设置好图片路径的,那么如果我们的图片是存储在服务器上的,那么我们肯定不能直接把服务的图片地址填上去了.这个时候我们可以动态地创建识别图.步骤如下: ...

  3. 【BZOJ2083】[Poi2010]Intelligence test 二分

    [BZOJ2083][Poi2010]Intelligence test Description 霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列.Lyx很渴望成为霸 ...

  4. 【BZOJ1124】[POI2008]枪战Maf 贪心+思路题

    [BZOJ1124][POI2008]枪战Maf Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开 ...

  5. Bloom Filters

    http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html A Bloom filter is a method for represe ...

  6. cordova 插件创建

    peng@PENG-PC /E/_My_File_____/_work/MyCode/myCode/cordova-workspace/plugman-test/ABCD $ npm install ...

  7. fusioncharts 用法实例

    支持xml格式和json格式的数据. 用法很简单. 1.需要引入FusionCharts.js. 2.html中定义个id="chart"的div <div id=" ...

  8. Java for LeetCode 100 Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  9. CodeChef - ANDMIN —— 线段树 (结点最多被修改的次数)

    题目链接:https://vjudge.net/problem/CodeChef-ANDMIN Read problems statements in Mandarin Chinese, Russia ...

  10. openfire build(2)

    InterceptorManager PluginManager openfire 插件的中servlet 在web-custom.xml 中的配置 url 一定要小写,访问时不区别大写小 否则404 ...