poj 2104 K-th Number(划分线段树)
2014-08-23 20:09
375 查看
//poj 2104 K-th Number(划分线段树) #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int MAXN=100100; int st[MAXN];//对所存序列进行排序(取基准元素所用) struct node { int l,r; }tree[MAXN*4];//建立线段树所用空间 int arrsub[33][MAXN]; int arrl_len[33][MAXN];//计算多少个进入左孩子 int n,m; void build(int inode,int l,int r,int deep) { tree[inode].l=l;tree[inode].r=r; if(l==r) return ; int mid=(l+r)/2; int midv=st[mid]; int ltomid=mid-l+1; for(int i=l;i<=r;i++) { if(arrsub[deep][i]<midv) ltomid--; } int lto,rto; lto=rto=0; for(int i=l;i<=r;i++) { if(i==l) { arrl_len[deep][i]=0; } else { arrl_len[deep][i]=arrl_len[deep][i-1]; } if(arrsub[deep][i]<midv) { arrl_len[deep][i]++; arrsub[deep+1][l+lto++]=arrsub[deep][i]; } else if(arrsub[deep][i]>midv) { arrsub[deep+1][mid+1+rto++]=arrsub[deep][i]; } else { if(ltomid>0) { arrl_len[deep][i]++; arrsub[deep+1][l+lto++]=arrsub[deep][i]; ltomid--; } else { arrsub[deep+1][mid+1+rto++]=arrsub[deep][i]; } } } build(inode*2,l,mid,deep+1); build(inode*2+1,mid+1,r,deep+1); } int query(int l,int r,int k,int inode ,int deep) { if(l==r) return arrsub[deep][l]; int sum,ts; if(l==tree[inode].l) { ts=0; } else { ts=arrl_len[deep][l-1]; } sum=arrl_len[deep][r]-ts; int ls=tree[inode].l; int rs=tree[inode].r; int mid=(ls+rs)/2; if(sum>=k) { return query(ls+ts, ls+arrl_len[deep][r]-1 , k, inode*2 , deep+1); } else { int ee = l - ls + 1 - ts ; int e = r - l - sum ; return query(mid+ee , mid+ee+e, k-sum , inode*2+1 ,deep+1); } } int main() { int a,b,c; while(scanf("%d%d",&n,&m)==2) { for(int i=1;i<=n;i++) { scanf("%d",&st[i]); arrsub[1][i]=st[i]; } sort(st+1,st+n+1); build(1,1,n,1); for(int i=0;i<m;i++){ scanf("%d %d %d",&a,&b,&c); printf("%d\n",query(a,b,c,1,1)); } /*for(int i=1;i<=7;i++) { printf("%d ",st[i]); } printf("\n\n"); for(int i=1;i<=7;i++) { for(int j=1;j<=7;j++) { printf("%d ",arrsub[i][j]); } printf("\n"); } cout<<endl; for(int i=1;i<=7;i++) { for(int j=1;j<=7;j++) { printf("%d",arrl_len[i][j]); } printf("\n"); }*/ } return 0; }
相关文章推荐
- POJ 2104 K-th Number (划分树 函数式线段树)
- poj 2104 K-th Number(可持久线段树)
- K-th Number - POJ 2104 划分树
- POJ 2104 K-th Number 划分树
- POJ 2104 K-th Number (划分树,主席树写过了,这次是整体二分解法 )
- 【划分树】 POJ 2104 HDU 2665 K-th Number 裸题
- poj 2104 K-th Number(线段树)
- poj 2104 K-th Number(可持久化线段树)
- poj 2104 K-th Number 划分树
- POJ 2104 K-th Number 线段树
- POJ_2104_K-th Number_线段树(归并树)
- POJ 2104 K-th Number (可持久化线段树)
- 【划分树】 POJ 2104 HDU 2665 K-th Number 裸题
- POJ 2104 K-th Number(可持久化线段树-求第K大)
- POJ 2104 K-th Number 可持久化线段树
- POJ 2104 K-th number 主席树 函数式线段树
- POJ 2104 K-th Number 区间第K大,可持久化线段树
- poj 2104 K-th Number 划分树
- POJ 2104 K-th Number(可持久化线段树)
- [poj]-2104-K-th Number-可持久化线段树