可持久化二项堆

namespace Binomial_Heap {
    struct Node {
        int c[2] , x ;
        LL val ;
    } T[MAXN * 200] ;
    struct Heap {
        int n ;
        pii rt[BLOCK] ;
        Heap () : n ( 0 ) {}
        pii& operator [] ( const int& idx ) {
            return rt[idx] ;
        }
        void init ( int o = 0 ) {
            n = !!o , rt[0] = pii ( o , !!o ) ;
        }
    } Root[MAXN] ;
    pii S[BLOCK] ;
    int node_num ;
    int newnode ( Node& o ) {
        T[node_num] = o ;
        return node_num ++ ;
    }
    void init () {
        node_num = 1 ;
        T[0].c[0] = T[0].c[1] = T[0].x = T[0].val = 0 ;
    }
    int merge_tree ( int x , int y ) {
        int o1 = newnode ( T[x] ) , o2 = newnode ( T[y] ) ;
        if ( T[x].val > T[y].val ) swap ( o1 , o2 ) ;
        T[o2].c[1] = T[o1].c[0] ;
        T[o1].c[0] = o2 ;
        return o1 ;
    }
    void merge_heap ( Heap& x , Heap& y ) {
        int nx = x.n , ny = y.n , &n = x.n = 0 ;
        for ( pii u ; nx || ny ; S[n ++] = u ) {
            u = ( nx && ny ? x[nx - 1].ed < y[ny - 1].ed : !!nx ) ? x[-- nx] : y[-- ny] ;
            while ( n && u.ed == S[n - 1].ed ) u = pii ( merge_tree ( u.st , S[-- n].st ) , u.ed + 1 ) ;
        }
        for ( int i = 0 ; i < n ; ++ i ) x[i] = S[n - i - 1] ;
    }
    void insert ( Heap& x , LL val , int v ) {
        int o = newnode ( T[0] ) ;
        T[o].val = val , T[o].x = v ;
        Root[0].init ( o ) ;
        merge_heap ( x , Root[0] ) ;
    }
    void show ( int u ) {
        printf ( "%d %lld %d %d\n" , u , T[u].val , T[u].c[0] , T[u].c[1] ) ;
        if ( T[u].c[0] ) show ( T[u].c[0] ) ;
        if ( T[u].c[1] ) show ( T[u].c[1] ) ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值