可并堆
可以支持合并的堆.
/*大根堆*/ struct heap{ int l,r,w; }h[N]; int rt[N];//第i个堆的根的下标 /*合并以x,y为根的堆*/ inline int merge(int x,int y){ int t; //其中一个堆为空 if(!x||!y) return x+y; //使得x,y两个根中x大 if(h[x].w<h[y].w){ int t=x;x=y;y=t; } //保持堆两边的平衡 h[x].r=merge(y,h[x].r); t=h[x].l;h[x].l=h[x].r;h[x].r=t; 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; }
时间: 2024-12-14 14:46:52