zoukankan      html  css  js  c++  java
  • 【无图慎入】Link Cut Tree 总结

    动态树(准确说是维护森林)之一,支持连边,断边,求链上权值和等操作。

    splay基础:会rotate和splay就行。还要会一点区间反转操作打标记。很基♂础的东西。

    有重链,每条重链用splay来维护,splay中排名为这条重链中深度值,顺便把链的要维护信息(譬如链上点权和)统计了。

    边分实边和虚边,实边有ch数组记录,虚边则没有。都有fa数组记录。
    虚边链接两条重链。父子关系即原树的父子关系。

    连到父亲的边为虚边的点就是这条重链的splay的根。

    splay

    splay(x)。先从上往下下放一遍,再执行splay。
    注意rotate中如果y-z的边是虚边不用往回连。

    access

    access(x)。最主要操作&&最耗时间的操作,没有之一。

    拉一条从x所在树的根节点到x的链。

    从x开始往上拉,y初始化为0,每次先splay(x),x左子树为连上去的重链,右子树为连下去的重链。
    断掉右子树的边,连成y。(断边指实变虚

    makeroot

    makeroot(x)。将x变成x所在树的根。
    先access(x),这时有一条从root到x的重链。
    然后splay(x),再在x上打一个反转标记(这条重链上的深度要反转)

    split

    split(x,y)。搞出一条重链,两端点为x和y。
    makeroot(x),access(y),splay(y)。
    不多解释了?
    (我习惯把这个直接写进代码,so看不到split函数)

    link(x,y)。连一条x-y的边。
    makeroot(x),然后将FA♂x置为y。
    这里连轻边没事的。

    cut

    cut(x,y)。割♂掉x-y的边。
    split(x,y),然后x在y左儿子处不解释。
    FA♂x=ch[y][0]=0。

    find

    找到x所在树的根。主要用于判断连通性???
    先access(x),splay(x),再一直往左边走就找到根了。不解释了。。。

    写到这里吧。

    已经做了的板子题:
    洞穴勘测
    弹飞绵羊

  • 相关阅读:
    UVA10090 数论基础 exgcd
    UVA 10037 贪心算法
    ST表入门学习poj3264 hdu5443 hdu5289 codeforces round #361 div2D
    poj3254状压DP入门
    I.点进来吧,这里有你想要的(01背包)
    J.哭泣的阿木木(线段树模板题)
    可怜的ljb(树状数组,逆序对)
    D武器大师的宝贝(最大相交区间,异或,最大公约数)
    银行排队模拟(队列,模拟,数据结构)
    B
  • 原文地址:https://www.cnblogs.com/xzz_233/p/8064958.html
Copyright © 2011-2022 走看看