zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    hive学习
    spark Streaming
    spark sql
    参考
    数论基础
    2020.07.17模拟3
    2020.07.16模拟2
    关于Linux环境下的对拍
    2020.07.15模拟1
    三体
  • 原文地址:https://www.cnblogs.com/NightRaven/p/9333251.html
Copyright © 2011-2022 走看看