poj1442(treap求第k大)

Posted windfreedom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1442(treap求第k大)相关的知识,希望对你有一定的参考价值。

ac代码:

#include<bits/stdc++.h>
using namespace std;
#define per(i,a,b) for(int i=a;i <= b;i++)
#define Max(a,b) a=max(a,b)
#define Min(a,b) a=min(a,b)
#define Sz(x) (int)x.size()
typedef long long ll;
ll gcd(ll a,ll b){while(b){ll t=b;b=a%b;a=t;} return a;}
const int inf=0x3f3f3f3f;
#define siz 30005
int m,n,num[siz],qr[siz],ord;
struct TreapNode
{
    int rnd,sz;
    TreapNode*child[2];
    int v;
    TreapNode(int val):v(val){
        rnd=rand();
        child[0]=child[1]=NULL;
        sz=1;
    }
    void update(){sz=1; if(child[0]!=NULL)sz+=child[0]->sz; if(child[1]!=NULL)sz+=child[1]->sz;}
}*root,*tmp;
void Rotate(TreapNode*&u,int type)
{
    tmp=u->child[type^1];
    u->child[type^1]=tmp->child[type];
    tmp->child[type]=u;
    u->update();
    u=tmp;
    u->update();
}
void Insert(TreapNode*&u,int val)
{
    if(u==NULL){
        u=new TreapNode(val);
    }
    else {
        int type=val > u->v;
        Insert(u->child[type],val);
        if(u->child[type]->rnd > u->rnd)Rotate(u,type^1);
    }
    u->update();
}
void k_th(TreapNode*u,int k)//按照ord的数字找
{
    if(k==1&&u->child[0]==NULL){printf("%d
",u->v);return;}
    if(u->child[0]==NULL)return k_th(u->child[1],k-1);
    if(u->child[0]->sz == k-1){
        printf("%d
",u->v);
        return;
    }
    if(u->child[0]->sz < k-1)return k_th(u->child[1],k - u->child[0]->sz - 1);
    else if(u->child[0]->sz > k-1)return k_th(u->child[0],k);
}
void Print(TreapNode*u)
{
    if(u==NULL)return;
    Print(u->child[0]);
    printf("%d ",u->v);
    Print(u->child[1]);
}

int main()
{
    std::ios::sync_with_stdio(false);
    root=tmp=NULL;
    while(scanf("%d %d",&m,&n)!=EOF){
        ord=0;
        per(i,1,m)scanf("%d",&num[i]);
        qr[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&qr[i]);
            for(int j=qr[i-1]+1;j<=qr[i];j++){
                Insert(root,num[j]);
                //printf("root:%d  ",root->v);Print(root);printf("
");
            }
            ord++;
            k_th(root,ord);
        }
    }

    return 0;
}

/*
9 5
5 2 1 4 8 6 3 9 7
1 3 5  9 9
*/

 

以上是关于poj1442(treap求第k大)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1442(treap || 优先队列)

POJ 1442 Black Box(优先队列)

优先队列(堆)经典例题——poj1442 black fox

优先队列(堆)经典例题——poj1442 black fox

动态数组第k小,Poj(1442)

poj2985