poj 2104 K-th Number(主席树)

来源:互联网 发布:正规网络兼职赚钱 编辑:程序博客网 时间:2024/05/22 05:33

初学主席树。。。。
卿学姐视频中的例题:
http://www.bilibili.com/video/av4619406/?from=search&seid=136071245852691687#page=1

附俩学习链接:
http://blog.csdn.net/coco56181712/article/details/75578177
http://blog.csdn.net/your_eyes_see_sea/article/details/77801856

#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int MAXN = 1e5+10;int n,m,cnt,root[MAXN],a[MAXN],x,y,k;struct node{    int l,r,sum;}T[MAXN*30];vector<int> v;int getid(int x){    return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}void update(int l, int r, int &x, int y, int k){    T[++cnt] = T[y];    T[cnt].sum++;    x = cnt;    if(l == r) return;    int mid = (l+r) >> 1;    if(k <= mid) update(l,mid,T[x].l,T[y].l,k);    else update(mid+1,r,T[x].r,T[y].r,k);}int query(int l, int r, int x, int y, int k){    if(l == r) return l;    int mid = (l+r) >> 1;    int sum = T[T[y].l].sum - T[T[x].l].sum;    if(sum >= k) return query(l,mid,T[x].l,T[y].l,k);    else return query(mid+1,r,T[x].r,T[y].r,k-sum);}int main(){    scanf("%d %d",&n,&m);    for(int i = 1; i <= n; ++i)    {        scanf("%d",&a[i]);        v.push_back(a[i]);    }    sort(v.begin(),v.end());    v.erase(unique(v.begin(),v.end()),v.end());    for(int i = 1; i <= n; ++i)        update(1,n,root[i],root[i-1],getid(a[i]));    for(int i = 1; i <= m; ++i)    {        scanf("%d %d %d",&x,&y,&k);        printf("%d\n",v[query(1,n,root[x-1],root[y],k)-1]);    }    return 0;}
原创粉丝点击