treap平衡树

今天集训讲平衡树,就瞎搞了一下。直接下代码。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime> 
#include<cstdlib>
using namespace std;
int cnt; //现在的点总数
int lc[100010],rc[100010];
//左右儿子
int sz[100010]; //子树大小
int V[100010]; //当前点的权值 
int R[100010];//为随机的值,为了保证堆的性质 
void update(int cur) //子树大小 
{
    sz[cur] = sz[lc[cur]] + sz[rc[cur]] + 1;
}
void right_rotate(int &q)
{
    int p = lc[q];
    lc[q] = rc[p];
    rc[p] = q;
    update(q);
    update(p);
    q = p;
}
void left_rotate(int &q)
{
    int p = rc[q];
    rc[q] = lc[p];
    lc[p] = q;
    update(q);
    update(p);
    q = p;
}
void insert(int &cur,int v) //cur为当前节点,v为插入的值 
{
    if(!cur)
    {
        cur = ++ cnt;
        V[cnt] = v;
        R[cnt] = rand();
        return;
    }
    if(v < V[cur])
    {
        insert(lc[cur],v);
        update(cur);
        if(R[lc[cur]] < R[cur])
        {
            right_rotate(cur);
        }
    }
    else
    {
        insert(rc[cur],v);
        update(cur);
        if(R[rc[cur]] < R[cur])
        {
            left_rotate(cur);
        }
    }
}
void del(int &cur,int v)
{
    if(!cur)
    return;
    if(V[cur] == v)
    {
        if(lc[cur] && rc[cur])
        {
            left_rotate(cur);
            del(lc[cur],v);
        }
        else
        {
            cur = lc[cur] | rc[cur];
            update(cur);
            return;
        }
    }
    else if(V[cur] > v)
    {
        del(lc[cur],v);
    }
    else
    del(rc[cur],v);
    update(cur);
}
int main()
{
    return 0; 
}
原文地址:https://www.cnblogs.com/DukeLv/p/9324444.html