其他分享
首页 > 其他分享> > BST—平衡树

BST—平衡树

作者:互联网

Treap尽心尽力

对于treap来说, 使用随机数的方式使数据被打乱, 利用平衡树的旋转达到简化访问的目的。(初步理解)

#include <cstdio>
#include <algorithm>
#include <iostream>
#define il inline
#define rg register int
#define ll long long
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]

using namespace std;

il int read()
{
    int x = 0; char c; bool f = false;
    while (!isdigit(c = getchar()))if (c == '-')f = true;
    do
    {
        x = (x << 1) + (x << 3) + (c ^ 48);
    }while (isdigit(c = getchar()));
    return f ? -x : x;
}

const int N = 1e5 + 10;
const int inf  = 1e9;
int n, tot, root;
int ch[N][2], val[N], size[N], pro[N], cnt[N];

int neww (int x)
{
    val[++tot] = x;
    pro[tot] = rand();
    size[tot] = 1;
    cnt[tot] = 1;
    return tot;
}

void pushup (int x)
{
    size[x] = size[ls (x)] + size[rs (x)] + cnt[x];
    return ;
}

void build ()
{
    root = neww (-inf);
    rs (root) = neww (inf);
    pushup (root);
}

void rotate (int &x, int d)
{
    int son = ch[x][d ^ 1];
    ch[x][d ^ 1] = ch[son][d];
    ch[son][d] = x;
    pushup (x); pushup (x = son);
}

void insert (int &x , int vl)
{
    if (!x)
    {
        x = neww (vl);
        return;
    }
    if (vl == val[x]) ++ cnt[x];
    else
    {
        int d = val[x] < vl;
        insert (ch[x][d], vl);
        if (pro[x] < pro[ch[x][d]])rotate (x, d ^ 1);
    }
    pushup (x);
}

void del (int &x, int vl)
{
    if (!x)return;
    if (vl == val[x])
    {
        if (cnt[x] > 1)
        {
            --cnt[x];
            pushup (x);
            return;
        }
        if (ls (x) || rs (x))
        {
            if (!rs (x) || pro[ls (x)] > pro[rs (x)])
            {
                rotate (x, 1);
                del (rs (x), vl);
            }
            else
            {
                rotate (x, 0);
                del (ls (x), vl);
            }
            pushup (x);
        }
        else x = 0;
        return;
    }
    int d = vl < val[x];
    del (ch[x][d ^ 1], vl);
    pushup (x);
    return;
}

int rk (int x, int vl)
{
    if (!x)return 0;
    if (vl == val[x])return size[ls (x)] + 1;
    if (vl < val[x])return rk (ls (x), vl);
    return size[ls (x)] + cnt[x] + rk (rs (x), vl);
}

int vval (int x, int r)
{
    if (!x)return inf;
    if (r <= size[ls (x)])return vval (ls (x), r);
    if (r <= size[ls (x)] + cnt[x])return val[x];
    return vval (rs (x), r - size[ls (x)] - cnt[x]);
}

int pre (int vl)
{
    int x = root, ti;
    while (x)
    {
        if (val[x] < vl)ti = val[x], x = rs (x);
        else x = ls (x);
    }
    return ti;
}

int next (int vl)
{
    int x = root, ti;
    while (x)
    {
        if (val[x] > vl)ti = val[x], x = ls (x);
        else x = rs (x);
    }
    return ti;
}

int main()
{
    build();
    n = read();
    for (rg i = 1; i <= n; ++i)
    {
        int opt = read(), x = read();
        if (opt == 1)insert (root, x);
        else if (opt == 2)del (root, x);
        else if (opt == 3)printf ("%d\n", rk (root, x) - 1);
        else if (opt == 4)printf ("%d\n", vval (root, x + 1));
        else if (opt == 5)printf ("%d\n", pre (x));
        else printf ("%d\n", next (x));
    }
    return 0;
}

18:51:24


 

标签:return,rs,BST,vl,int,ls,平衡,define
来源: https://www.cnblogs.com/zyhLambons/p/16342504.html