K小数查询主席树
来源:互联网 发布:android 屏保源码 编辑:程序博客网 时间:2024/05/22 05:01
K-th Number
Time Limit: 20000MS Memory Limit: 65536K
Total Submissions: 57304 Accepted: 19808
Case Time Limit: 2000MS
Description
You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment.
That is, given an array a[1…n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: “What would be the k-th number in a[i…j] segment, if this segment was sorted?”
For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2…5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.
Input
The first line of the input file contains n — the size of the array, and m — the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000).
The second line contains n different integer numbers not exceeding 109 by their absolute values — the array for which the answers should be given.
The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).
Output
For each question output the answer to it — the k-th number in sorted a[i…j] segment.
Sample Input
7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3
Sample Output
5
6
3
Hint
This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.
Source
Northeastern Europe 2004, Northern Subregion
%:pragma GCC optimize(3)//垃圾map,常数暴大,下次绝对不用了!!! using namespace std;#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<map>#define r(x) scanf("%d",&x)#define N 3000001int L[N],R[N],val[N];int xx[N],cnt,a[N],b[N];int lc[N],rc[N],sz;int root[N],n;int x,y,k,m;void pushup(int x){ val[0]=0; val[x]=val[lc[x]]+val[rc[x]];}void build(int r1,int r2,int w){ int mid=(L[r1]+R[r1])>>1; if(L[r1]==R[r1]) { val[r1]++;return; } if(w>mid) {rc[r1]=++sz;L[sz]=mid+1;val[sz]=val[rc[r2]];R[sz]=R[r1];lc[r1]=lc[r2];build(rc[r1],rc[r2],w);} else { lc[r1]=++sz;L[sz]=L[r1];R[sz]=mid;val[sz]=val[lc[r2]];rc[r1]=rc[r2];build(lc[r1],lc[r2],w); } pushup(r1);}int query(int r1,int r2,int k){ if(L[r1]==R[r1]) return xx[L[r1]]; if(k<=(val[lc[r1]]-val[lc[r2]]))return query(lc[r1],lc[r2],k); return query(rc[r1],rc[r2],k-(val[lc[r1]]-val[lc[r2]]));}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) {scanf("%d",&a[i]);b[i]=a[i];} sort(b+1,b+n+1); xx[++cnt]=b[1]; for(int i=2;i<=n;i++) if(b[i]!=b[i-1])xx[++cnt]=b[i]; for(int i=1;i<=n;i++) { a[i]=lower_bound(xx+1,xx+cnt+1,a[i])-xx; } for(int i=1;i<=n;i++) { root[i]=++sz; int r1=root[i],r2=root[i-1]; L[r1]=1;R[r1]=cnt; build(r1,r2,a[i]); } for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); printf("%d\n",query(root[y],root[x-1],k)); }}
- K小数查询主席树
- zoj-2112(主席树动态求区间第k小数)
- COGS 1534 [NEERC 2004]K小数 主席树题解
- K小数查询
- [JZOJ4438]K小数查询
- K小数查询:分块
- [POJ2104] K-th Number(区间K小数,主席树模板)
- bzoj3110[Zjoi2013]K大数查询 主席树套线段树
- hdu 2665(主席树查询区间k大值)
- 主席树查询区间第K大模板
- bzoj3524 [Poi2014]Couriers(主席树查询第k小)
- 【HNOI模拟】 K小数查询
- K小数查询 分块模板
- k-th number(主席树 )
- 【HNOI2016模拟4.10】 K小数查询
- [JZOJ4438] K小数查询(经典分块)
- 【HNOI2016模拟4.10】 K小数查询
- [BZOJ3110][Zjoi2013]K大数查询(主席树套线段树||整体二分 )
- 高效使用 Python 可视化工具 Matplotlib
- 安装ubuntu
- JFinal
- 第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
- 安卓异步处理——AsyncTask<Params, Progress, Result>
- K小数查询主席树
- eclipse中使用sql语句
- 浅谈幅度调制(Amplitude Modulation)
- finished with non-zero exit value 1
- ssh免密登陆配置
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora 动态规划
- Linux url调测工具--curl
- 第五章 常用Lua开发库3-模板渲染
- 剑指offer-二叉树中和为某一值的路径