zoukankan      html  css  js  c++  java
  • [转]LCT讲解

    LCT

    (1)维护一个序列,支持下列操作: 

    区间求和
    区间求最值
    区间修改
    求连续子段和
    这个线段树就可以解决 具体做法不加累述了
    (2)维护一个序列,支持下列操作:
    区间求和
    区间求最值
    区间修改
    求连续子段和
    添加一段区间
    删除一段区间
    翻转一段区间
    Splay的基本操作
    (3)维护一棵树,支持下列操作:
    链上求和
    链上求最值
    链上修改
    子树修改
    子树求和
    树链剖分!!!
    (4)维护一棵树,支持下列操作:
    链上求和
    链上求最值
    链上修改
    断开树上的一条边
    连接两个点,保证连接后仍然是一棵树
    由于树是动态的,我们不能每次操作都重标号一遍 树链剖分搞不了了
    然而我们可以沿用树链剖分的轻重链剖分的概念
    既然是动态那么我们肯定要把静态的线段树换成动态的Splay
    于是就有LCT≈树链剖分+Splay

    『引入一些概念』

    Preferred Child:重儿子,重儿子与父亲节点同在一棵Splay中,一个节点最多只能有一个重儿子
    Preferred Edge:重边,连接父亲节点和重儿子的边
    Preferred Path:重链,由重边及重边连接的节点构成的链

    『Auxiliary Tree(辅助树)』

    由一条重链上的所有节点所构成的Splay称作这条链的辅助树
    每个点的键值为这个点的深度
    辅助树的根节点的父亲指向链顶的父亲节点,然而链顶的父亲节点的儿子并不指向辅助树的根节点
    (儿子认爹&&爹不认儿子)
    原树中的重链 -> 辅助树中两个节点位于同一棵Splay中
    原树中的轻链 -> 辅助树中子节点所在Splay的根节点的father指向其父节点
    注意原树与辅助树的结构并不相同

    那么切入正题咯

    那么LCT中最重要的操作可以说是….

    『Access操作』

    目的:将x的重边切断,并将x到根的路径上所有的边都搞成重边。
    具体实现:根据辅助树按照深度为关键字的性质。不断地将一个结点的父亲转到根,然后把这个结点接到它父亲的右儿子,此时要切断x下面的所有重边


    『Reverse操作』

    目的:将原树中的x结点转到根。
    具体实现:因为原树是虚树,所以在原树中进行变换实际上是在辅助树中进行变换。首先Access一个点,再将这个点在辅助树中转到根。又是根据辅助树按照深度为关键字的性质,将这个点所在的splay树反转,实际上改变了深度的关系,也就是实现的原树的换根。



    那么知道这两个之后其他的都是小菜咯

    『Link操作』

    目的:将两个不连通的点连通。换句话来说,合并或扔到一颗树里。
    具体实现:首先进行Reverse操作,在原树中将一个点转到那个点所在的树的根。然后将这个转到根的点的father接到另外一个点上。可以进行一次splay来update。

    『Cut操作』

    目的:将两个连通的点不连通,换句话说,把一棵树拆成两棵树。
    具体实现:首先进行Reverse操作,在原树中将一个点转到那个点所在的树的根。然后Access另外一个点,把另外一个点在辅助树中转到根。由于这两个点原先是连通的,那么进行Access操作之后两个点在辅助树中一定是一个位于根,一个位于根的左儿子(深度)。所以在辅助树中把这个边砍掉就行了。

    『Find操作』

    目的:寻找一个点在原树中的根。
    用于:判断两个点的连通性。
    具体实现:首先Access这个点,然后在辅助树中将这个点转到根,由于辅助树按照深度为关键字排序,所以不断地向左子树寻找,就可以找到深度最小的根。

    差不多就这些啦,还有一些奇怪的求和啊,维护最大值最小值什么的和线段树平衡树等数据结构基本一样。也难怪,LCT其实就是线段树、平衡树的延伸。
    ---------------------
    作者:wwyx2001
    来源:CSDN
    原文:https://blog.csdn.net/Blue_CuSO4/article/details/78618811
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/lyp-Bird/p/10349718.html
Copyright © 2011-2022 走看看