浅谈左偏树
关于左偏树这个东西嘛……还是挺简单的。
就是一个merge操作:
int merge(int x, int y){
//pushdown(x); pushdown(y); // 这里可以下放标记
if(!x || !y) return x + y; //特判一下
if(sum[x] > sum[y]) swap(x, y);//保持堆的性质
ch[x][1] = merge(ch[x][1], y);//下面的就是左偏树的精髓所在了,只可会意
if(dis[ch[x][0]] < dis[ch[x][1]]) swap(ch[x][0], ch[x][1]); //就是这个奇奇怪怪的操作可以保证堆为log层
dis[x] = dis[ch[x][1]] + 1;
return x;
}
没了? 没了
就这个merge操作可以完成插入、删除还有合并(merge本来就是合并嘛……)