POJ2104 K-th Number 主席树
2015-10-23 08:48
357 查看
题目链接:http://poj.org/problem?id=2104
题目大意:求区间第k小的数。
分析:主席树模板题。
实现代码如下:
题目大意:求区间第k小的数。
分析:主席树模板题。
实现代码如下:
#include<stdio.h> #include<algorithm> #define N 100010 int T ; int num ; int san ; int ls[N*20]; int rs[N*20]; int sum[N*20]; int tot,rt; int n, m; void Build(int l,int r,int &rt) { rt=++tot; sum[rt]=0; if(l==r) return ; int m=(l+r)>>1; Build(l,m,ls[rt]); Build(m+1,r,rs[rt]); } void Update(int last,int p,int l,int r,int &rt) { rt=++tot; ls[rt]=ls[last]; rs[rt]=rs[last]; sum[rt]=sum[last]+1; if(l==r) return ; int m=(l+r)>>1; if(p<=m) Update(ls[last],p,l,m,ls[rt]); else Update(rs[last],p,m+1,r,rs[rt]); } int Query(int ss,int tt,int l,int r,int k) { if(l==r) return l; int m=(l+r)>>1; int cnt=sum[ls[tt]]-sum[ls[ss]]; if(k<=cnt) return Query(ls[ss],ls[tt],l,m,k); else return Query(rs[ss],rs[tt],m+1,r,k-cnt); } void gogogo() { int l,r,k; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); san[i]=num[i]; } tot=0; std::sort(san+1,san+n+1); int cnt=std::unique(san+1,san+n+1)-san-1; Build(1,cnt,T[0]); for(int i=1;i<=n;i++) num[i]=std::lower_bound(san+1,san+cnt+1,num[i])-san; for(int i=1;i<=n;i++) Update(T[i-1],num[i],1,cnt,T[i]); while(m--) { scanf("%d%d%d",&l,&r,&k); int id=Query(T[l-1],T[r],1,cnt,k); printf("%d\n",san[id]); } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); gogogo(); } return 0; }
相关文章推荐
- 第六周实践项目~后缀表达式
- 第7周项目4队列数组
- GVUserDefaults 使用
- 企业财物数据下载链接
- 第8周 项目5-计数的模式匹配
- GCD实践——多线程图片下载与信号量开发实践
- 第9周 项目2—对称矩阵压缩存储的实现和应用
- 第七周项目四—队列数组
- 三、状态管理
- 《CLR Via C#》学习--线程开销
- 变形--位移 translate()
- 第七周 队列数组
- 第八周-项目1 - 建立顺序串的算法库
- github分支管理
- 第四周:单链表的应用举例
- 字符串匹配--最大最小表示法模板
- POJ 1860——Currency Exchange——————【最短路、SPFA判正环】
- 1021. 个位数统计 (15)
- 第八周项目2-建立链串的算法库
- Android: LinearLayout布局和其嵌套运用举例