[主席树] BZOJ 1803 Spoj1487 Query on a tree III
2016-05-13 16:20
441 查看
题目大意:子树第k大
裸题 dfs序好了
裸题 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; }
相关文章推荐
- 分段控件----UISegmentedControl
- java修改request的paramMap
- 对map的value进行排序的方法
- 自定义UITabBarController
- Android-Universal-Image-Loader(UIL)源码解析(一)
- Web UI组件化最佳实践的思考
- php json_decode() 如果想要强制生成PHP关联数组,json_decode()需要加一个参数true
- jQquery实现从左边select框添加到右边,并且可以上下排序
- UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
- UITableView-03LOL英雄
- Android高阶UI之CountdownView
- MQTT协议学习—Mosquitto安装、测试
- UIScrollView与UITextview
- SPOJ QTREE4 Query on a tree IV
- HDU 3932 Groundhog Build Home (模拟退火算法)
- 1153 - Paquet plus grand que 'max_allowed_packet' (navicat)
- request对象JSP学习
- Xcode项目中的常见文件-UI进阶
- java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql
- IOS开发UISearchBar失去第一响应者身份后,取消按钮不执行点击事件的问题