左偏树 模板

最近因为写一道贪心的题目,需要用到左偏树,而我早就忘记怎么写了。。。。于是就再去看了一遍。

其实左偏树的思想并不难。其本质是一个堆,然后每次合并入右子树,而保持左子树距离最长,也就是说向看起来小的子树中合并,从而使堆一定程度上平衡。他可以做到在 O(logn) 的时间内合并两个堆,十分酷。

关于其应用其实有很多,比如今年 APIO 的 Dispatching (派遣)等。其实如果希望代码量少一点,可以牺牲一下常数,把堆做左偏树来写也可以。

Code :

node * merge(node * a, node * b)
{
	if (! a) return b;
	if (! b) return a;
	if (b->k < a->k) swap(a, b);
	a->r = merge(a->r, b);
	if (! a->l || a->r && a->l && a->r->dis > a->l->dis) swap(a->r, a->l);
	if (a->r) a->dis = a->r->dis + 1; else a->dis = 0;
	return a;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值