• POJ 3481 treap


    这是利用treap写的二叉排序树,只要理解其中旋转能够改变树的左右子树平衡度,即高度之差,差不多就能掌握treap树的要领了。

    相对于其他高级BST,treap树实现应该算最简单了,利用的是随机树产生的理论的二叉排序树时间复杂度为O(nlgn)来实现,具体证明 算法导论 中有。

    推荐NOCOW中的讲解,关于二叉排序树相当完整!

    treap动画展示:http://www.ibr.cs.tu-bs.de/courses/ss98/audii/applets/BST/Treap-Example.html

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    #include <cmath>
    #include <utility>
    #include <vector>
    #include <queue>
    #include <map>
    #include <set>
    #include <ctime>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)>(y)?(y):(x))
    #define INF 0x3f3f3f3f
    #define MAXN 100005
    
    using namespace std;
    
    int cnt=1, rt=0;
    
    struct Tree{
        int key, num, pri, son[2];
        void set(int _x, int _y, int _z){
            key=_x;
            num=_y;
            pri=_z;
            son[0]=son[1]=0;
        }
    }T[MAXN];
    
    void rotate(int &x, int p) //1 右旋 0 左旋
    {
        int y=T[x].son[!p];
        T[x].son[!p]=T[y].son[p];
        T[y].son[p]=x;
        x=y;
    }
    
    void ins(int &x, int key, int num)
    {
        if(x == 0)
            T[x=cnt++].set(key, num, rand());
        else
        {
            int p=key < T[x].key;
            ins(T[x].son[!p], key, num);
            if(T[x].pri < T[T[x].son[!p]].pri) rotate(x, p);
        }
    }
    
    void del(int &x, int key)
    {
        if(T[x].key == key)
        {
            if(T[x].son[0] && T[x].son[1])
            {
                int p=T[T[x].son[0]].pri > T[T[x].son[1]].pri;
                rotate(x, p);
                del(T[x].son[p], key);
            }
            else
            {
                if(!T[x].son[0]) x=T[x].son[1];
                else x=T[x].son[0];
            }
        }
        else
        {
            int p=T[x].key > key;
            del(T[x].son[!p], key);
        }
    }
    
    int get(int x, int p)
    {
        while(T[x].son[p])
            x=T[x].son[p];
        return x;
    }
    
    int main ()
    {
        srand(time(NULL));
        int p, key, num, x;
        while(scanf("%d", &p) && p)
        {
            switch (p)
            {
                case 1:
                    scanf("%d%d", &num, &key);
                    ins(rt, key, num);
                    break;
                case 2:
                    x=get(rt, 1);
                    if(x)
                    {
                        printf("%d
    ",T[x].num);
                        del(rt, T[x].key);
                    }
                    else
                        printf("0
    ");
                    break;
                case 3:
                    x=get(rt, 0);
                    if(x)
                    {
                        printf("%d
    ",T[x].num);
                        del(rt, T[x].key);
                    }
                    else
                        printf("0
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    I
    H
    装箱问题
    E
    Oracle创建视图(View)
    (转)Navicat Premium 12.1.8.0安装与激活
    bigdecimal 保留小数位
    用命令修改Oracle数据库密码
    sql中exists,not exists的用法
    在Orcl中通过SQL语句修改创建表
  • 原文地址:https://www.cnblogs.com/Mathics/p/3967195.html
Copyright © 2020-2023  润新知