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

来源:互联网 发布:台湾网络电视tv版 编辑:程序博客网 时间:2024/06/06 13:39

题目大意:子树第k大

裸题 dfs序好了


#include<cstdio>#include<cstdlib>#include<algorithm>#include<map>#define V G[p].vusing 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[N];int root[N],ls[21*N],rs[21*N],sum[21*N];int ncnt;int sx[N],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]];elsels[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);elsereturn query(rs[y],rs[x],mid+1,r,k-tmp);}struct edge{int u,v;int next;};edge G[2*N];int head[N],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[N],size[N],last[N];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;}


0 0
原创粉丝点击