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] ) ;
}
}
可持久化二项堆
最新推荐文章于 2022-02-19 12:09:18 发布