HDU4006(The kth great number)优先级队列/SBT

来源:互联网 发布:沈阳市网络金融 编辑:程序博客网 时间:2024/05/16 15:02
/*************************************************题目大意:针对每次查询,输出第K大数;算法思想:(1)根据题意可知,只需保留前K个大数,并且按降序排列;也就是说每加入一个数就找到这个数的位置;然后将大于K个元素之外的数删除;利用优先级队列就可以很好的做到;(2)SBT或者树状数组解决;**************************************************/#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>using namespace std;const int N=1000010;int l[N],r[N],s[N];int key[N];int node;void left_rotate(int &t){    int k=r[t];    r[t]=l[k];    l[k]=t;    s[k]=s[t];    s[t]=s[l[t]]+s[r[t]]+1;    t=k;}void right_rotate(int &t){    int k=l[t];    l[t]=r[k];    r[k]=t;    s[k]=s[t];    s[t]=s[l[t]]+s[r[t]]+1;    t=k;}void maintain(int &t,bool flag){    if(flag==false)    {        if(s[l[l[t]]]>s[r[t]])            right_rotate(t);        else if(s[l[r[t]]]>s[r[t]])        {            left_rotate(t);            right_rotate(t);        }        else            return ;    }    else    {        if(s[r[r[t]]]>s[l[t]])            left_rotate(t);        else if(s[r[l[t]]]>s[l[t]])        {            right_rotate(t);            left_rotate(t);        }        else            return ;    }    maintain(l[t],false);    maintain(r[t],true);    maintain(t,false);    maintain(t,true);}void insert(int &t,int k){    if(!t)    {        s[t=++node]=1;        l[t]=r[t]=0;        key[t]=k;    }    else    {        ++s[t];        if(key[t]>k)            insert(l[t],k);        else            insert(r[t],k);        maintain(t,k>=key[t]);    }}int select(int t,int k){    int v=s[l[t]]+1;    if(k==v)        return key[t];    else if(k<v)        return select(l[t],k);    else        return select(r[t],k-v);}int main(){    //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);    int n,k;    while(~scanf("%d%d",&n,&k))    {        int u=node=s[0]=0;        while(n--)        {            char c;            int x;            scanf(" %c",&c);            if(c=='I')            {                scanf("%d",&x);                insert(u,x);            }            else                printf("%d\n",select(u,s[u]+1-k));        }    }    return 0;}

 

优先级队列:

#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<queue>using namespace std;/*struct node{int tmp;friend bool operator<(const node a,const node b){return a.tmp>b.tmp;}};*/int main(){//freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);int n,k;while(~scanf("%d%d",&n,&k)){//priority_queue<node>Q;priority_queue<int,vector<int>,greater<int> > Q;for(int i=1;i<=n;i++){char c;scanf(" %c",&c);if(c=='I'){int x;scanf("%d",&x);Q.push(x);if(Q.size()>k)Q.pop();}elseprintf("%d\n",Q.top());}}return 0;}


 

原创粉丝点击