标签:
Description
Input
Output
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
题意:
给你n个数,q次询问
每次询问l,r之间的第k小的数是多少
题解:
不理解就去套板子啊
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; const int N = 1e5+10, M = 1e5, mod = 1e9, inf = 1e9+9; typedef long long ll; int n,q,a[N],pos[N],c[N]; struct cooltree{ struct node {int l,r,v;}tr[N*20]; int sz,root[N]; void init() { sz = 0, root[0] = 0; } void update(int &k,int l,int r,int x) { tr[++sz] = tr[k], k = sz; ++tr[k].v; if(l==r) return ; int mid = (l+r)>>1; if(x <= mid) update(tr[k].l,l,mid,x); else update(tr[k].r,mid+1,r,x); } int ask(int x,int y,int k) { int l = 1, r = n; x = root[x-1], y = root[y]; while(l!=r) { int mid = (l+r)>>1, now = tr[tr[y].l].v - tr[tr[x].l].v; if(k <= now) x = tr[x].l,y = tr[y].l, r = mid; else x =tr[x].r , y = tr[y].r, l = mid + 1, k-=now; } return a[l]; } }T; int main() { T.init(); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%d",&a[i]), c[i] = a[i]; sort(a+1,a+n+1); int cnt = unique(a+1,a+n+1) - a - 1; //cout<<cnt<<endl; for(int i=1;i<=n;i++) pos[i] = lower_bound(a+1,a+cnt+1,c[i]) - a; for(int i=1;i<=n;i++) T.update(T.root[i] = T.root[i-1],1,n,pos[i]); for(int i=1;i<=q;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); printf("%d\n",T.ask(x,y,z)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zxhl/p/5388532.html