[ 模板 ] Treap指针版

来源:互联网 发布:calendar java设置今天 编辑:程序博客网 时间:2024/05/23 11:50
#include <stdio.h>#include <stdlib.h>struct Treap{    Treap *Lson,*Rson;    int val,key,cnt,size;    Treap(int num)    {        Lson = Rson = NULL;        val = num;        key = rand();        cnt = size = 1;    }    void push_up()    {        size = cnt;        if(Lson) size += Lson->size;        if(Rson) size += Rson->size;    }    friend void zig(Treap *&A)//左旋    {        Treap *B = A -> Lson;        A -> Lson = B -> Rson;        B -> Rson = A;        A = B;        A->Rson->push_up();        A->push_up();    }    friend void zag(Treap *&A)//右旋    {        Treap *B = A -> Rson;        A -> Rson = B -> Lson;        B -> Lson = A;        A = B;        A->Lson->push_up();        A->push_up();    }    friend void insert(Treap *&rt,int num)    {        if(rt == NULL)        {            rt = new Treap(num);            return ;        }        else if(num == rt->val)        {            rt->cnt++;        }        else if(num < rt->val)        {            insert(rt->Lson,num);            if(rt->Lson->key > rt->key)                zig(rt);        }        else        {            insert(rt->Rson,num);            if(rt->Rson->key > rt->key)                zag(rt);        }        if(rt) rt -> push_up();    }    friend void delete_num(Treap *&rt,int num)    {        if(rt == NULL)            return ;        else if(num < rt->val)            delete_num(rt->Lson,num);        else if(num > rt->val)            delete_num(rt->Rson,num);        else        {            if(rt->cnt > 1)                rt->cnt--;            else if(rt->Lson == NULL)                rt = rt->Rson;            else if(rt->Rson == NULL)                rt = rt->Lson;            else            {                if(rt->Lson->key > rt->Rson->key)                {                    zag(rt);                    delete_num(rt->Lson,num);                }                else                {                    zig(rt);                    delete_num(rt->Rson,num);                }            }        }        if(rt) rt->push_up();    }    friend int search_rank(Treap *rt,int num)    {        if(rt==NULL)            return 0;        int Lsize = (rt->Lson ? rt->Lson->size : 0);        if(rt->val == num)            return Lsize+1;        else if(rt->val < num)            return Lsize + rt->cnt + search_rank(rt->Rson,num);        else            return search_rank(rt->Lson,num);    }    friend int search_num(Treap *rt,int rank)    {        if(rt == NULL)            return 0;        int Lsize = (rt->Lson ? rt->Lson->size : 0);        if(Lsize >= rank)            return search_num(rt->Lson,rank);        else if(Lsize+rt->cnt < rank)            return search_num(rt->Rson,rank-Lsize-rt->cnt);        else            return rt->val;    }    friend void search_pre(Treap *rt,int num,Treap *&p)    {        if(rt == NULL)            return ;        else if(rt->val < num)        {            p = rt;            search_pre(rt->Rson,num,p);        }        else search_pre(rt->Lson,num,p);    }    friend void search_suc(Treap *rt,int num,Treap *&p)    {        if(rt == NULL)            return ;        else if(rt->val > num)        {            p = rt;            search_suc(rt->Lson,num,p);        }        else search_suc(rt->Rson,num,p);    }}*rt,*ans;int n,opt,x;int main(){    srand(20000620);    rand();    scanf("%d",&n);    while(n--)    {        scanf("%d%d",&opt,&x);        if(opt == 1)            insert(rt,x);        if(opt == 2)            delete_num(rt,x);        if(opt == 3)            printf("%d\n",search_rank(rt,x));        if(opt == 4)            printf("%d\n",search_num(rt,x));        if(opt == 5)        {            ans = NULL;            search_pre(rt,x,ans);            printf("%d\n",ans->val);        }        if(opt == 6)        {            ans = NULL;            search_suc(rt,x,ans);            printf("%d\n",ans->val);        }    }    return 0;}
0 0
原创粉丝点击