POJ 3481 Double Queue(treap练习)

题目链接:http://poj.org/problem?id=3481

题意:一个数列开始为空,三种操作:(1)1 x,y,将(x,y)插入;(2)2询问y最大的x,并将其删除;(3)3 询问y最小的x,并将其删除。

思路:treap的插入、查找、删除,都用了。



struct node

{

    int L,R,key,pri;

};



class treap

{

public:

    node p[N];

    int size,root;



    void init()

    {

        srand(time(0));

        size=root=-1;

    }



    void rotL(int &x)

    {

        int y=p[x].R;

        p[x].R=p[y].L;

        p[y].L=x;

        x=y;

    }



    void rotR(int &x)

    {

        int y=p[x].L;

        p[x].L=p[y].R;

        p[y].R=x;

        x=y;

    }



    void insert(int &k,int key,int pri)

    {

        if(k==-1)

        {

            k=++size;

            p[k].L=p[k].R=-1;

            p[k].key=key;

            p[k].pri=pri;

        }

        else if(key<p[k].key)

        {

            insert(p[k].L,key,pri);

            if(p[p[k].L].pri>p[k].pri) rotR(k);

        }

        else

        {

            insert(p[k].R,key,pri);

            if(p[p[k].R].pri>p[k].pri) rotL(k);

        }

    }



    void remove(int &k,int key)

    {

        if(k==-1) return;

        if(key<p[k].key) remove(p[k].L,key);

        else if(key>p[k].key) remove(p[k].R,key);

        else

        {

            if(p[k].L==-1&&p[k].R==-1) k=-1;

            else if(p[k].L==-1) k=p[k].R;

            else if(p[k].R==-1) k=p[k].L;

            else

            {

                if(p[p[k].L].pri<p[p[k].R].pri)

                {

                    rotL(k);

                    remove(p[k].L,key);

                }

                else

                {

                    rotR(k);

                    remove(p[k].R,key);

                }

            }

        }

    }



    int findMax(int k)

    {

        if(k==-1)

        {

            puts("0");

            return 0;

        }

        while(p[k].R!=-1) k=p[k].R;

        PR(p[k].pri);

        return p[k].key;

    }



    int findMin(int k)

    {

        if(k==-1)

        {

            puts("0");

            return 0;

        }

        while(p[k].L!=-1) k=p[k].L;

        PR(p[k].pri);

        return p[k].key;

    }

};





treap a;

int op,x,y;



int main()

{

    a.init();

    Rush(op)

    {

        if(!op) break;

        if(op==1) RD(x,y),a.insert(a.root,y,x);

        else if(op==2)

        {

            x=a.findMax(a.root);

            if(x) a.remove(a.root,x);

        }

        else

        {

            x=a.findMin(a.root);

            if(x) a.remove(a.root,x);

        }

    }

    return 0;

}

  

你可能感兴趣的:(double)