博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

POJ 1442 Black Box (Treap)

http://poj.org/problem?id=1442
题意:每次操作插入一个数或者GET一个数,每次GET出的是第K大的数,K在每次GET后都要加一。
题解:其实完全可以不用Treap做,为了训练一下就用Treap写了。

using namespace std;
vector<int> v;
struct Treapnode
{
    Treapnode *left,*right;
    int value,fix;
    Treapnode(int a)
    {
        this->value=a;
        this->fix=rand();
        this->left=this->right=NULL;
    }
};
Treapnode *root;
void Treapleft(Treapnode *&a)
{
    Treapnode *b=a->right;
    a->right=b->left;
    b->left=a;
    a=b;
}
void Treapright(Treapnode *&a)
{
    Treapnode *b=a->left;
    a->left=b->right;
    b->right=a;
    a=b;
}
void Treapprint(Treapnode *p)
{
    if(p!=NULL)
    {
        if(p->left!=NULL)
            Treapprint(p->left);
        v.pb(p->value);
        if(p->right!=NULL)
            Treapprint(p->right);
    }
}
void Treapinsert(Treapnode *&p,int value)
{
    if(p==NULL)
    {
        p=new Treapnode(value);
    }
    else
    {
        if(value<=p->value)
        {
            Treapinsert(p->left,value);
            if(p->left->fix<p->fix && p->left!=NULL)
                Treapright(p);
        }
        else
        {
            Treapinsert(p->right,value);
            if(p->right->fix<p->fix && p->right!=NULL)
                Treapleft(p);
        }
    }
}
int n,m,k;
int in[300010],ou[300010];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>in[i];
    }
    for(int i=1;i<=m;i++)
    {
        int x;
        cin>>x;
        ou[x]++;
    }
    for(int i=1;i<=n;i++)
    {
        Treapinsert(root,in[i]);
        if(ou[i])
        {
            v.clear();
            if(root!=NULL)
                Treapprint(root);
            for(int j=0;j<ou[i];j++)
            {
                cout<<v[k]<<endl;
                k++;
            }
        }
    }
    return 0;
}
posted @ 2017-07-23 23:25  NTR-NightRaven  阅读(81)  评论(0编辑  收藏  举报