FHQ_Treap平衡树模板

本文深入解析了FHQ Treap数据结构的实现细节,包括初始化、随机数生成、节点构建、合并、分割、查找、插入、删除等关键操作。FHQ Treap是一种结合了Treap和Splay Tree特性的高效数据结构,适用于动态维护有序集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct FHQ_Treap
{
    struct fhq_treap
    {
        int l,r;
        int v,rnd;
        int sizes;
    }ftr[maxn];
    int sizes,root,tmp;
    void Init()
    {
        sizes = root = 0;
    }
    int Random()
    {
        static int seed = 703;
        return seed = (int)(seed*48271LL%2147483647);
    }
    void Update( int k )
    {
        if ( !k )
            return;
        ftr[k].sizes = ftr[ftr[k].l].sizes+ftr[ftr[k].r].sizes+1;
    }
    void Build( int &k , int x )
    {
        k = ++sizes;
        ftr[k].rnd = Random();
        ftr[k].v = x;
        ftr[k].sizes = 1;
        ftr[k].l = 0;
        ftr[k].r = 0;
    }
    void Merge( int &k , int l , int r )
    {
        if ( !l||!r )
            k = l+r;
        else if ( ftr[l].rnd<ftr[r].rnd )
            k = l,Merge( ftr[k].r , ftr[k].r , r ),Update( k );
        else
            k = r,Merge( ftr[k].l , l , ftr[k].l ),Update( k );
    }
    void Split( int k , int &l , int &r , int s )
    {
        if ( !s )
            l = 0,r = k;
        else if ( s==ftr[k].sizes )
            l = k,r = 0;
        else if ( s<=ftr[ftr[k].l].sizes )
            r = k,Split( ftr[k].l , l , ftr[k].l , s ),Update( k );
        else
            l = k,Split( ftr[k].r , ftr[k].r , r , s-ftr[ftr[k].l].sizes-1 ),Update( k );
    }
    int Rank( int k , int x )
    {
        if ( !k )
            return 0;
        if ( ftr[k].v>=x )
            return Rank( ftr[k].l , x );
        else
            return Rank( ftr[k].r , x )+ftr[ftr[k].l].sizes+1;
    }
    void Insert( int k )
    {
        int x,y,rk = Rank( root , k );
        Split( root , x , y , rk );
        Build( tmp , k );
        Merge( x , x , tmp );
        Merge( root , x , y );
    }
    void Delete( int k )
    {
        int x,y,z,rk = Rank( root , k )+1;
        Split( root , x , y , rk );
        Split( x , x , z , rk-1 );
        Merge( root , x , y );
    }
    int Find( int k )
    {
        int x,y,z,ans;
        Split( root , x , y , k );
        Split( x , z , x , k-1 );
        ans = ftr[x].v;
        Merge( x , z , x );
        Merge( root , x , y );
        return ans;
    }
    int Pre( int k )
    {
        int x,y,z,ans,rk = Rank( root , k );
        Split( root , x , y , rk );
        Split( x , z , x , rk-1 );
        ans = ftr[x].v;
        Merge( x , z , x );
        Merge( root , x , y );
        return ans;
    }
    int Suc( int k )
    {
        int x,y,z,ans,rk = Rank( root , k+1 );
        Split( root , x , y , rk+1 );
        Split( x , z , x , rk );
        ans = ftr[x].v;
        Merge( x , z , x );
        Merge( root , x , y );
        return ans;
    }
}fhq_treap;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值