区间第K大(划分树)
来源:互联网 发布:monaco windows 编辑:程序博客网 时间:2024/05/01 06:53
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1175
注意一个很明显的结论:求区间[p,q]的第K大就等于求区间[p,q]的第q-p+1-k小。
#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>using namespace std;const int N = 100005;int sorted[N];int Tree[20][N];int toLeft[20][N];void Build(int k,int l,int r){ if(l==r) return; int mid=(l+r)>>1; int i,t; t=mid-l+1; for(i=l;i<=r;i++) if(Tree[k][i]<sorted[mid]) t--; int L=l; int R=mid+1; for(i=l;i<=r;i++) { if(i==l) toLeft[k][i]=0; else toLeft[k][i]=toLeft[k][i-1]; if(Tree[k][i]<sorted[mid]) { toLeft[k][i]++; Tree[k+1][L++]=Tree[k][i]; } else if(Tree[k][i]>sorted[mid]) { Tree[k+1][R++]=Tree[k][i]; } else { if(t!=0) { t--; toLeft[k][i]++; Tree[k+1][L++]=Tree[k][i]; } else Tree[k+1][R++]=Tree[k][i]; } } Build(k+1,l,mid); Build(k+1,mid+1,r);}int Query(int k,int l,int r,int p,int q,int t){ if(p==q) return Tree[k][p]; int s,ss; int mid=(l+r)>>1; if(l==p) { s=0; ss=toLeft[k][q]; } else { s=toLeft[k][p-1]; ss=toLeft[k][q]-s; } int L,R; if(t<=ss) { L=l+s; R=l+s+ss-1; return Query(k+1,l,mid,L,R,t); } else { L=mid-l+1+p-s; R=mid-l+1+q-s-ss; return Query(k+1,mid+1,r,L,R,t-ss); }}int main(){ int n,m,i,j; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) { scanf("%d",&Tree[0][i]); sorted[i]=Tree[0][i]; } std::sort(sorted+1,sorted+n+1); Build(0,1,n); scanf("%d",&m); int p,q,k; while(m--) { scanf("%d%d%d",&p,&q,&k); p++;q++;k--; printf("%d\n",Query(0,1,n,p,q,q-p+1-k)); } } return 0;}
- 区间第K大(划分树)
- 划分树——求区间第k大值
- POJ 2104 区间第K大值(划分树做法)
- 静态区间第k大(划分树)
- 区间第k大的数 划分树模板
- poj查询区间第k大(划分树)
- 划分树的学习(求区间第k大的数字)&&分块求区间第k大
- 查询区间第k大 POJ2104 暴力 or 划分树 or 归并树
- hdu 2665 Kth number 区间第K大值 划分树
- poj 2401 划分树 求区间第k大的数
- 划分树(基本用法是求给定区间的第k大的值)
- POJ 2761 Feed the dogs 求区间第k大 划分树
- HDU 4251 The Famous ICPC Team Again 划分树 区间第K大
- hdu 4417 Super Mario (二分法 + 划分树求区间第K大)
- POJ 2104K-th Number&&HDU 2665Kth number划分树 求区间第k大 裸题
- 区间第K大
- 第K大区间
- 区间第k大
- Linpack的安装部署
- ARM体系结构与编程学习(十二)
- 试着让你的生活变得清淡
- 第五周任务一
- GCC 与 LLVM-GCC 与 Clang之间关系
- 区间第K大(划分树)
- 嵌入式linux的mdev机制
- ARM体系结构与编程学习(十三)
- 疯狂的android讲义学习笔记
- 第三次上机作业
- autobook中文版
- 第三次程序设计上级报告
- 表字段出现oracle sql语句关键字时
- CTreeCtrl 节点支持拖拽功能