解题关键: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. 【BZOJ3291】Alice与能源计划 二分图最大匹配

    [BZOJ3291]Alice与能源计划 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星 ...

  2. 我的Android进阶之旅------>Android使用正则表达式匹配扫描指定目录下的所有媒体文件(音乐、图像、视频文件)

    今天使用正则表达式匹配指定目录下的所有媒体文件,下面将这份代码简化了,可以收藏下来,当作工具类. package match; import java.io.File; import java.uti ...

  3. PHP获取 当前页面名称、主机名、URL完整地址、URL参数、获取IP

    $URL['PHP_SELF'] = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME ...

  4. css集合--表示有未读消息小红点的解决

    只需要一个<i>标签,放在需要的文本后面即可 ex:<span>待解决问题<i></i><span> i{ display:block; b ...

  5. Java for LeetCode 093 Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  6. VS调试的问题

    调试Vs,使用本地IIS也不行,使用外部服务器也不行,最后运行VS2013以管理员身份就可以了

  7. 关于for 循环里 线程执行顺序问题

    最近在做项目时遇到了 这样的需求 要在一个for循环里执行下载的操作, 而且要等 下载完每个 再去接着走循环.上网查了一些 觉得说的不是很明确.现在把我用到的代码 贴上 希望可以帮到有此需求的开发者  ...

  8. JavaScript(3)

    var a=90; switch(a){ case "890": window.alert("ok"); break; case 90: window.aler ...

  9. rand()与srand()

    1.不用srand()的话 两次运行程序产生的随机数序列相同 2.用srand() 两次运行程序产生的随机数则不同 示例程序: #include<iostream> #include< ...

  10. 小程序js页面设置上导航颜色

    //导航条颜色更改 wx.setNavigationBarColor({ frontColor: '#ffffff', // 必写项 backgroundColor: '#008de6', // 必写 ...