[xdoj1216]子树第k小(dfs序+主席树)
解题关键: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序+主席树)的更多相关文章
- 2018.09.30 bzoj3551:Peaks加强版(dfs序+主席树+倍增+kruskal重构树)
传送门 一道考察比较全面的题. 这道题又用到了熟悉的kruskal+倍增来查找询问区间的方法. 查到询问的子树之后就可以用dfs序+主席树统计答案了. 代码: #include<bits/std ...
- 【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 ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)
背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了... 描述 ...
随机推荐
- java 邮件(2)
/** * 方法描述:发送带附件的邮件 * * @throws UnsupportedEncodingException */ public static boolean sendEmai ...
- SCRM从入门到精通01
[SCRM从入门到精通01]如何基于微信开放接口开发企业的微信CRM? 业内一直都在传说微信是天生的CRM,可是没有人看到过微信CRM的真容.随着微信最新公众平台的改版和开放接口的微信认证开放,微信C ...
- computed 计算属性
wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=wepy%e9%a1%b9%e7%9b%ae%e7%9a%8 ...
- 【题解】P2602[JZOI2010]数字计数
[题解][P2602ZJOI2010]数字计数 乍看此题,感觉直接从数字的位上面动手,感觉应该很容易. 但是仔细看数据范围,发现如果不利用计数原理,肯定会超时,考虑数码出现的特征: \(A000\)到 ...
- OpenCV改变像素颜色
Mat src=imread("image/color.jpg"); imshow("a",src); int i,j; int cPointR,cPointG ...
- LeetCode——Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
- C#winform的datagridview设置选中行
this.dataGridView1.CurrentCell = this.dataGridView1[colIndex, rowIndex];this.dataGridView1.BindingCo ...
- NISP:一级取证
NISP:一级取证 BrupSuite工具的使用 设置浏览器代理 flag{C0ngratulati0n} flag{LMvBi8w9$m1TrgK4} flag{T4mmL9GhpaKWunPE} ...
- 一个商品SKU是怎么生成的
首先说一说什么是SKU.......自己百度去... 类似京东上面,未来人类S5这个台笔记本(没错,我刚入手了) 都是S5这个型号,但是因为CPU,显卡,内存,硬盘等不同,价格也不一样.CPU,显卡, ...
- 关于SQL语句参数中为多个带‘,’的字符串
案例分析:画面为多分数选项,根据画面选择的分数组合=@分数,以SELECT * FROM [table_name] WHERE sore IN (@分数) 其实这不算一个复杂的问题,可能由于着急下班, ...