zoukankan      html  css  js  c++  java
  • 左偏树

    左偏树可以用来维护可并堆(并查集加堆)

    可以用并查集一样的路径压缩来优化复杂度

    路径压缩后(fa)记录的就不为其原树中的父亲,而是用来表示堆与堆之间的关系

    (dis:)表示该节点到它子树内最近的叶子节点的距离

    节点的左儿子的距离不小于右儿子的距离,每次合并时,将一棵树合并到另一棵树的右子树,来保证复杂度

    (dis[x]=dis[rs[x]]+1)

    (n)个节点的左偏树距离最大为(log(n+1)-1)

    (merge:)(y)合并在(x)上,返回(x),即为合并后树的根

    (merge)(del)操作都需保证节点为其所在堆的根

    (code:)

    int find(int x)
    {
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    int merge(int x,int y)
    {
    	if(!x||!y) return x+y;
    	if(val[x]>val[y]) swap(x,y);
    	rs[x]=merge(rs[x],y),fa[rs[x]]=x;
    	if(dis[ls[x]]<dis[rs[x]]) swap(ls[x],rs[x]);
    	if(rs[x]) dis[x]=dis[rs[x]]+1;
    	else dis[x]=0;
    	return x;
    }
    void del(int x)
    {
    	val[x]=-1;
    	fa[ls[x]]=ls[x],fa[rs[x]]=rs[x];
    	fa[x]=merge(ls[x],rs[x]);
    }
    
  • 相关阅读:
    java线程(1)-线程同步
    Scala:(3)数组
    Codeforces 899F Letters Removing
    拼图游戏的可解性
    Hash
    哈夫曼编码
    莫比乌斯
    FFT
    Ropes
    区间合并
  • 原文地址:https://www.cnblogs.com/lhm-/p/12229591.html
Copyright © 2011-2022 走看看