POJ 2104 K-th Number (主席树 静态区间第K大)

来源:互联网 发布:js 工作流设计器 编辑:程序博客网 时间:2024/05/19 22:28

题意:给你n个不同的数字,m次询问,每次询问l->r这个区间内第k大的树是多少

分析:刚学主席树试着写了一发,值得注意的是主席树是多颗线段树,并且每颗线段树存的都是插入第i个数字的状态,

树中结点存储的是每个区间插入第i个数字之后总共插入了多少个数字,每一次的插入过程都是logn的建树。

根据主席树的这个特点,只需要找到插入l-1这个数字时的线段树状态和r时的状态,根据两者区间插入数字的差值

就能从中找到第k大。


#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<algorithm>#include<map>#include<cstdlib>#include<cmath>#include<vector>//#pragma comment(linker, "/STACK:1024000000,1024000000");using namespace std;#define INF 0x3f3f3f3f#define maxn 100005vector<int>v;int cnt;int root[maxn];int a[maxn];struct node{    int l,r;    int siz;}T[maxn*40];int getid(int x){    return (lower_bound(v.begin(),v.end(),x)-v.begin())+1;}void init(){    for(int i=0;i<maxn;i++) root[i]=0;    for(int i=0;i<40*maxn;i++) T[i].l=T[i].r=T[i].siz=0;    cnt=0;}void update(int pos,int l,int r,int &x,int y){    T[++cnt]=T[y],T[cnt].siz++,x=cnt;//找到需要更新的结点,申请新的结点替换掉    if(l==r)    {        return ;    }    int mid=(l+r)>>1;    if(pos<=mid) update(pos,l,mid,T[x].l,T[y].l);    else update(pos,mid+1,r,T[x].r,T[y].r);}int query(int l,int r,int x,int y,int k){    if(l==r) return l;    int mid=(l+r)>>1;    int siz=T[T[y].l].siz-T[T[x].l].siz;    if(k<=siz) return query(l,mid,T[x].l,T[y].l,k);    else return query(mid+1,r,T[x].r,T[y].r,k-siz);}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        v.clear();        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            v.push_back(a[i]);        }        init();        sort(v.begin(),v.end());        for(int i=1;i<=n;i++)        {            int p=getid(a[i]);            update(p,1,n,root[i],root[i-1]);        }        while(m--)        {            int l,r,k;            scanf("%d%d%d",&l,&r,&k);            printf("%d\n",v[query(1,n,root[l-1],root[r],k)-1]);        }    }    return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子不听话控制不住发火怎么办 儿子不听话我总会发火怎么办 小孩好动精力不集中怎么办 孩子好动精力不集中怎么办 一岁半宝宝咳嗽半个月了怎么办 6岁儿童上课调皮怎么办 小孩挨揍后精神失控怎么办 孩子不听话把我胃气疼了怎么办 因为孩子不听话夫妻经常吵架怎么办 11岁儿子不听话了怎么办 二十岁的儿子还不听话怎么办 幼儿园小班幼儿不听老师的话怎么办 幼师对待不听话的孩子该怎么办 2岁宝宝不吃饭只喝奶怎么办 孩子哭着喊妈妈不睡觉怎么办 孩子晚上不睡觉一直哭怎么办 孩子不睡觉还哭怎么办 孩子晚上不睡觉老哭怎么办? 4岁宝宝叛逆期怎么办 驾考紧张脚抖怎么办 驾考科目三紧张怎么办 孩子不自信容易紧张怎么办 在人多时候紧张怎么办 考科目二很紧张怎么办 明天出成绩很紧张怎么办 一紧张就射精了怎么办 孩子在幼儿园表现不好怎么办 小孩子在幼儿园表现的不好怎么办 学籍档案写错了怎么办 发展报告填错了怎么办 学生发展报告丢了怎么办 大一新生入学团员档案袋丢失怎么办 三年级孩子语文成绩差怎么办 运气不好时 我们该怎么办 猫走了财运变差怎么办 特别在意别人的眼光怎么办 入职两个月没有业绩怎么办 在学舞蹈中孩子怕疼怎么办 我生二胎怕疼怎么办 孩子的执行力差怎么办 怀孕三个月不想要孩子怎么办