码迷,mamicode.com
首页 > 其他好文 > 详细

左偏树

时间:2019-02-22 10:20:50      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:写法   color   pen   实现   return   nlogn   维护   one   持久   

可并堆有一种黑科技是用线段树合并实现,还能可持久化,时间复杂度nlogn。

这里介绍左偏树。

d值表示走右边到叶子的距离。满足d[r] <= d[l]

写法上用rt维护根节点,类似线段树。

放一个模板。

技术图片
namespace lt {
    int ls[N], rs[N], siz[N], d[N], rt[N];
    LL val[N], sum[N];
    int merge(int x, int y) {
        if(!x || !y) return x | y;
        if(val[x] < val[y]) std::swap(x, y);
        rs[x] = merge(rs[x], y);
        if(d[rs[x]] > d[ls[x]]) std::swap(ls[x], rs[x]);
        d[x] = d[rs[x]] + 1;
        sum[x] = sum[ls[x]] + sum[rs[x]] + val[x];
        siz[x] = siz[ls[x]] + siz[rs[x]] + 1;
        return x;
    }
    inline void exmerge(int x, int y) { // y -> x
        rt[x] = merge(rt[x], rt[y]);
        return;
    }
    inline void pop(int x) {
        rt[x] = merge(ls[rt[x]], rs[rt[x]]);
        return;
    }
    inline int getSum(int x) {
        return sum[rt[x]];
    }
    inline int getSiz(int x) {
        return siz[rt[x]];
    }
    inline void init(int i, LL v) {
        val[i] = v;
        sum[i] = v;
        siz[i] = 1;
        d[i] = 1;
        rt[i] = i;
        return;
    }
}
左偏树模板

洛谷P1552 派遣 模板。

洛谷P2713 罗马游戏 额外用一个并查集维护每个人在左偏树中的编号。

左偏树

标签:写法   color   pen   实现   return   nlogn   维护   one   持久   

原文地址:https://www.cnblogs.com/huyufeifei/p/10416658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!