zoukankan      html  css  js  c++  java
  • Treap标准模板

    这是Treap的模板程序,支持Left/Right Rotate,Find the maxnum/minnum,Find the predecessor/successor of a node,Add/Delete nodes 等绝大多数功能(不包含类似于”查找排名第k的元素”这样奇怪的东西的代码)

    #include<bits/stdc++.h>
    #include<windows.h>
    #define maxn 1000001
    #define Random(x) (rand()%x)
    #define ALLOW
    #define query_pred_succ
    #define query_delete
    
    using namespace std;
    
    typedef struct{
        int leftnode,rightnode,data,fix;        //data为数值,fix为修正值
        bool symbol;    //记录当前节点是否是空节点,0为空,1为非空 
    }node;
    
    class treap
    {
        public:
            node p[maxn];
            int size,root;
            treap()
            {
                srand(time(0));
                size=0;
                root=0;
            }
            void Treap_Left_Rotate(int &x)
            {
                int y=p[x].rightnode;
                p[x].rightnode=p[y].leftnode;
                p[y].leftnode=x;
                x=y;
            }
            void Treap_Right_Rotate(int &x)
            {
                int y=p[x].leftnode;
                p[x].leftnode=p[y].rightnode;
                p[y].rightnode=x;
                x=y;
            }
            void Treap_insert(int &k,int key)
            {
                if (k==0)
                {
                    k=++size;
                    p[k].leftnode=p[k].rightnode=0;
                    p[k].data=key;
                    p[k].fix=rand();
                } else
                if (key<p[k].data)
                {
                    Treap_insert(p[k].leftnode,key);
                    if (p[p[k].leftnode].fix>p[k].fix)
                        Treap_Right_Rotate(k);
                }
                else
                {
                    Treap_insert(p[k].rightnode,key);
                    if (p[p[k].rightnode].fix>p[k].fix)
                        Treap_Left_Rotate(k);
                }
            }
            void Treap_delete(int &k,int key)
            {
                if (k==0) return;
                if (key==p[k].data)
                {
                    if (p[k].leftnode==0 && p[k].rightnode==0) k=0;
                        else if (p[k].leftnode==0 && p[k].rightnode!=0) k=p[k].rightnode;
                            else if (p[k].leftnode!=0 && p[k].rightnode==0) k=p[k].leftnode;
                                else
                                if (p[p[k].leftnode].fix<p[p[k].rightnode].fix)
                                {
                                    Treap_Left_Rotate(k);
                                    Treap_delete(p[k].leftnode,key);
                                }
                                else
                                {
                                    Treap_Right_Rotate(k);
                                    Treap_delete(p[k].rightnode,key);
                                }
                } else
                if (key<p[k].data) Treap_delete(p[k].leftnode,key);
                    else Treap_delete(p[k].rightnode,key);
            }
            void in_order_print(int k)
            {
                p[k].symbol=1;
                if (p[k].leftnode!=0)
                    in_order_print(p[k].leftnode);
                printf("第%d个节点 : 值:%d   修正值:%d  左孩子:%d  右孩子:%d
    ",k,p[k].data,p[k].fix,p[k].leftnode,p[k].rightnode);
                if (p[k].rightnode!=0)
                    in_order_print(p[k].rightnode);
            }
            int find_max(int k)
            {
                if (p[k].rightnode!=0)
                    return find_max(p[k].rightnode);
                else return p[k].data;
            }
            int find_min(int k)
            {
                if (p[k].leftnode!=0)
                    return find_min(p[k].leftnode);
                else return p[k].data;
            }
            int Treap_pred(int k,int key,int optimal)
            {
                if (!p[k].symbol) return optimal;
                if (p[k].data<=key) return Treap_pred(p[k].rightnode,key,k);
                    else return Treap_pred(p[k].leftnode,key,optimal);
            }
            int Treap_succ(int k,int key,int optimal)
            {
                if (!p[k].symbol) return optimal;
                if (p[k].data>=key) return Treap_succ(p[k].leftnode,key,k);
                    else return Treap_succ(p[k].rightnode,key,optimal);
            }
    };
    
    treap T;
    int main()
    {
        int n,m;
        #ifdef ALLOW
            MessageBox(NULL,"This program is the standard Treap code
    Ability:Left/Right Rotate,Find the maxnum/minnum,Find the predecessor/successor of a node,Add/Delete nodes
    ","Tips",MB_OK);
        #endif 
        printf("Input the total nodes number:
    ");
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            int tmp;
            printf("No.%d : You want to insert:",i);
            scanf("%d",&tmp);
            T.Treap_insert(T.root,tmp);
        }
    
        printf("After inserting,the Treap is:
    ");
        T.in_order_print(T.root);
        printf("MAXNUM:     %d
    ",T.find_max(T.root));
        printf("MINNUM:     %d
    ",T.find_min(T.root));
        #ifdef query_pred_succ
            printf("How many nodes do you want to look for its predecessor/successor?
    ");
            scanf("%d",&m);
            if (m>0)
            {
                printf("Input format for looking for the predecessor:P num
    ");
                printf("Input format for looking for the successor  :S num
    ");
                char cmd;
                int tmp;
                int a=1;
                while (a<=n)
                {
                    cin>>cmd>>tmp;
                    if (cmd=='P') printf("%d
    ",T.Treap_pred(T.root,tmp,0));
                        else if (cmd=='S') printf("%d
    ",T.Treap_succ(T.root,tmp,0));
                            else MessageBox(NULL,"Unknown Command Type
    Please Input Again.","Error",MB_OK),a--;
                    a++;
                }
            }
        #endif
        #ifdef query_delete
            printf("How many nodes would you like to delete?(The number you input must be below%d)
    ",n);
            scanf("%d",&m);
            if (m>n) 
            {
                MessageBox(NULL,"The number you inputed just now is too big!!!","Error",MB_OK);
                return -1;
            }
            for (int i=1;i<=m;i++)
            {
                int tmp;
                printf("No.%d : You want to delete the node with value",i);
                scanf("%d",&tmp);
                T.Treap_delete(T.root,tmp);
                T.in_order_print(T.root);
            }
        #endif
        return 0;
    }
    

      

  • 相关阅读:
    2016 多校赛3 A 水 B 期望,规律 C 各种博弈 J 物理题,积分 K 暴力,水
    2016 多校赛4 A dp,KMP E(待补) F(待补) J LIS变形,套路 K 水 L 水
    2016-12-27 spoj MINSUB 二分,单调栈 spoj INTSUB 思维
    sqlmap用户手册
    用PROXYCHAINS实现SSH全局代理
    linux之sort用法
    PHP 变量定义及使用
    查漏补缺
    总结2
    最近
  • 原文地址:https://www.cnblogs.com/Leoleepz/p/6345008.html
Copyright © 2011-2022 走看看