可并堆

可以支持合并的堆.

/*大根堆*/
struct heap{
    int l,r,w,d;
}h[N];
int rt[N];//第i个堆的根的下标 
 
/*合并以x,y为根的堆*/
inline int merge(int x,int y){
    //其中一个堆为空 
    if(!x||!y) return x+y;
     
    //使得x,y两个根中x大 
    if(h[x].w<h[y].w) swap(x,y);
     
    //保持堆两边的平衡 
    h[x].r=merge(y,h[x].r);
    if(h[h[x].l].d<h[h[x].r].d)
        swap(h[x].l,h[x].r);
    h[x].d=h[h[x].r].d+1;
     
    return x;
}
inline int pop(int x){
    int l=h[x].l,r=h[x].r;
    h[x].l=h[x].r=h[x].w=0;
    return merge(l,r);
}
inline int top(x){
    return h[x].w; 
}

相关文章:

  • 2022-01-25
  • 2022-01-17
  • 2021-11-29
  • 2021-09-08
  • 2021-09-19
  • 2021-08-09
猜你喜欢
  • 2022-03-02
  • 2021-07-07
  • 2022-02-17
  • 2021-06-08
  • 2022-01-01
  • 2022-01-23
相关资源
相似解决方案