您的位置:首页 > 产品设计 > UI/UE

[主席树] BZOJ 1803 Spoj1487 Query on a tree III

2016-05-13 16:20 441 查看
题目大意:子树第k大

裸题 dfs序好了

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<map>
#define V G[p].v
using namespace std;

inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}

inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=100005;

int n,a
;
int root
,ls[21*N],rs[21*N],sum[21*N];
int ncnt;

int sx
,icnt;
inline int Bin(int x){
return lower_bound(sx+1,sx+icnt+1,x)-sx;
}

void Modify(int &y,int x,int l,int r,int t){
y=++ncnt; int mid=(l+r)>>1;
if (l==r) { sum[y]=sum[x]+1; return; }
if (t<=mid)
rs[y]=rs[x],Modify(ls[y],ls[x],l,mid,t),sum[y]=sum[ls[y]]+sum[rs[y]];
else
ls[y]=ls[x],Modify(rs[y],rs[x],mid+1,r,t),sum[y]=sum[ls[y]]+sum[rs[y]];
}

int query(int y,int x,int l,int r,int k){
if (l==r) return sx[l];
int mid=(l+r)>>1,tmp=sum[ls[y]]-sum[ls[x]];
if (k<=tmp)
return query(ls[y],ls[x],l,mid,k);
else
return query(rs[y],rs[x],mid+1,r,k-tmp);
}

struct edge{
int u,v;
int next;
};

edge G[2*N];
int head
,inum;

inline void add(int u,int v,int p){
G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}

int clk,tid
,size
,last
;

inline void dfs(int u,int fa){
tid[u]=++clk; Modify(root[clk],root[clk-1],1,icnt,Bin(a[u]));
size[u]=1;
for (int p=head[u];p;p=G[p].next)
if (V!=fa)
dfs(V,u),size[u]+=size[V];
last[u]=tid[u]+size[u]-1;
}

map<int,int> Map;

int main()
{
int iu,iv,Q;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n);
for (int i=1;i<=n;i++) read(a[i]),sx[++icnt]=a[i],Map[a[i]]=i;
sort(sx+1,sx+icnt+1);
icnt=unique(sx+1,sx+icnt+1)-sx-1;
for (int i=1;i<n;i++) read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);
dfs(1,0);
read(Q);
while (Q--)
{
read(iu); read(iv);
printf("%d\n",Map[query(root[last[iu]],root[tid[iu]-1],1,icnt,iv)]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: