poj2104 求区间第k大数(划分&&主席--待补)
2016-10-14 18:27
387 查看
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <algorithm> using namespace std; const int N=100010; int tree[25] ;//表示每层每个位置的值 int sorted ;//已经排序好的数 int toleft[25] ;//表示第i层从1到i有数分入左边 void build(int l,int r,int dep) { if(l==r) return ; int mid=(l+r)>>1; int same=mid-l+1;//表示等于中间值而且被分入左边的个数 for(int i=l;i<=r;i++)//注意是字母l if(tree[dep][i]<sorted[mid]) same--; int lpos=l,rpos=mid+1; for(int i=l;i<=r;i++) { if(tree[dep][i]<sorted[mid]) tree[dep+1][lpos++]=tree[dep][i]; else if(tree[dep][i]==sorted[mid]&&same>0) { tree[dep+1][lpos++]=tree[dep][i]; same--; } else tree[dep+1][rpos++]=tree[dep][i]; toleft[dep][i]=toleft[dep][l-1]+lpos-l; } build(l,mid,dep+1); build(mid+1,r,dep+1); } //查询区间第k大的数 int query(int L,int R,int k,int l,int r,int dep) { if(L==R) return tree[dep][L]; int mid=(l+r)>>1; int cnt=toleft[dep][R]-toleft[dep][L-1]; if(cnt>=k) { int newl=l+toleft[dep][L-1]-toleft[dep][l-1]; int newr=newl+cnt-1; return query(newl,newr,k,l,mid,dep+1); } else { int newr=R+toleft[dep][r]-toleft[dep][R]; int newl=newr-(R-L-cnt); return query(newl,newr,k-cnt,mid+1,r,dep+1); } } int main() { int n,m; scanf("%d%d",&n,&m); memset(tree,0,sizeof(tree)); for(int i=1;i<=n;i++) { scanf("%d",&tree[0][i]); sorted[i]=tree[0][i]; } sort(sorted+1,sorted+n+1); build(1,n,0); int l,r,k; while(m--) { scanf("%d%d%d",&l,&r,&k); printf("%d\n",query(l,r,k,1,n,0)); } }
相关文章推荐
- 【poj2104-求区间第k大数(不修改)】主席树/可持续化线段树
- 划分树的用法(一):查询区间第K大值值(poj2104)
- 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】
- 【主席树入门 && 区间内第k小的数】POJ - 2104 K-th Number
- 查询区间第k大 POJ2104 暴力 or 划分树 or 归并树
- POJ2104:划分树求区间第k小
- 划分树的用法(一):查询区间第K大值值(poj2104)
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
- 整体二分初探 两类区间第K大问题 poj2104 & hdu5412
- POJ 2104 & HDU 2665 & POJ 2761 K-th Number (主席树入门题 区间第K大)
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
- ZOJ 2112 & BZOJ 1901 Dynamic Rankings(主席树 单点更新 区间第K大)
- 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】
- poj2761&&poj2104 主席树(静态区间第K大)
- POJ2104-K-th Number-区间第k大-可持久化线段树/主席树
- POJ - 2104 K-th Number && POJ 2761 Feed the dogs(主席树静态区间第k大)
- 划分树的用法(一):查询区间第K大值值(poj2104)
- POJ2104-- K-th Number(主席树静态区间第k大)
- POJ2104 POJ2761 区间第K大 主席树
- HDOJ2665 &&poj2104 k-th number(主席树+求第K小)