在merge函数中的pushdown函数要放在开头。
具体的
WA:
int merge(int x,int y){
if(!x||!y)return x|y;
pushdown(x),pushdown(y);
if(hep[x].val>hep[y].val)swap(x,y)
....
}
AC:
int merge(int x,int y){
pushdown(x),pushdown(y);
if(!x||!y)return x|y;
if(hep[x].val>hep[y].val)swap(x,y)
....
}
原因:当你连续删除堆顶是会一直调用merge(ls(x),rs(x)); 若该堆为链状,那堆顶将不会被 pushdown 下来就被删除。