左偏树 模板

来源:互联网 发布:少女前线枪娘数据 编辑:程序博客网 时间:2024/06/06 00:27

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

其实左偏树的思想并不难。其本质是一个堆,然后每次合并入右子树,而保持左子树距离最长,也就是说向看起来小的子树中合并,从而使堆一定程度上平衡。他可以做到在 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;}


原创粉丝点击