• Note -「模板」FHQ-Treap


    
    // Fhq-Treap
    
    const int MAXN = 1e5 + 5;
    
    struct Fhq_Treap {
        struct Fhq_Node {
            int l, r, val, key, size;
    #define lson tr[p].l
    #define rson tr[p].r
            Fhq_Node() {}
            Fhq_Node(int L, int R, int Val, int Key, int Size) {
                l = L;
                r = R;
                val = Val;
                key = Key;
                size = Size;
            }
        } tr[MAXN];
        int tot, root;
    
        Fhq_Treap() {
            tot = 0, root = 0;
        }
    
        int Get(int val) {
            tr[++tot] = Fhq_Node(0, 0, val, rand(), 1);
            return tot;
        }
    
        void Push_Up(int p) { tr[p].size = tr[lson].size + tr[rson].size + 1; }
    
        void Split(int p, int val, int &x, int &y) {
            if (!p) {
                x = 0, y = 0;
                return;
            }
            if (tr[p].val <= val) {
                x = p;
                Split(rson, val, rson, y);
            } else {
                y = p;
                Split(lson, val, x, lson);
            }
            Push_Up(p);
        }
    
        int Merge(int x, int y) {
            if (!x || !y)
                return x + y;
            if (tr[x].key <= tr[y].key) {
                tr[x].r = Merge(tr[x].r, y);
                Push_Up(x);
                return x;
            } else {
                tr[y].l = Merge(x, tr[y].l);
                Push_Up(y);
                return y;
            }
        }
    
        void Insert(int val) {
            int x, y;
            Split(root, val, x, y);
            root = Merge(Merge(x, Get(val)), y);
        }
    
        void Delete(int val) {
            int x, y, z;
            Split(root, val, x, z);
            Split(x, val - 1, x, y);
            y = Merge(tr[y].l, tr[y].r);
            root = Merge(Merge(x, y), z);
        }
    
        int Get_Rank(int val) {
            int x, y, ret;
            Split(root, val - 1, x, y);
            ret = tr[x].size + 1;
            root = Merge(x, y);
            return ret;
        }
    
        int Get_Val(int Rank) {
            int p = root;
            while (p) {
                if (tr[lson].size + 1 == Rank)
                    return tr[p].val;
                else if (Rank <= tr[lson].size)
                    p = lson;
                else {
                    Rank -= (tr[lson].size + 1);
                    p = rson;
                }
            }
            return 0;
        }
    
        int Get_Pre(int val) {
            int x, y, p;
            Split(root, val - 1, x, y);
            p = x;
            while (rson) p = rson;
            int ret = tr[p].val;
            root = Merge(x, y);
            return ret;
        }
    
        int Get_Next(int val) {
            int x, y, p;
            Split(root, val, x, y);
            p = y;
            while (lson) p = lson;
            int ret = tr[p].val;
            root = Merge(x, y);
            return ret;
        }
    #undef lson
    #undef rson
    } tree;
    
  • 相关阅读:
    个人项目:Java实现WC
    第六篇Scrum冲刺博客
    java实现小学生四则运算
    实现wc部分功能 java
    WordCount作业修改
    我的过去、现在和未来
    WordCount
    Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
    《《《在同一台服务器上配置多个Tomcat
    关于Android 5.x的低功耗蓝牙BLE开发简介
  • 原文地址:https://www.cnblogs.com/Chain-Forward-Star/p/15216456.html
Copyright © 2020-2023  润新知