首页 > 其他分享 >Top Tree

Top Tree

时间:2023-11-27 17:34:06浏览次数:32  
标签:结点 Tree Top Rake Compress 根簇 端点

总归要学的。
先写一下理解比较困难的点。

  1. 考虑 SATT 的建立过程:首先在树里面找到一个Compress Tree,这个树满足中序遍历写下来是根簇路径深度从小到大排列,然后根簇路径上挂着的小簇Rake起来,这个 Rake 的过程是容易的,考虑对于每一个直接连接的小簇,把他变成子问题,然后给一个代表点(Rake Node),和子问题的 Compress Tree 的根节点连接,然后这些代表点一个一个连在一起,依照合并顺序变成 Rake Tree,我们可以认为 Rake Node 代表的是这里有一个小簇等待连边,而很明显Compress结点和Rake结点万万不能混在一起,所以我们就他们内部用二叉树各自维护平衡(使用 Splay),而中间使用三叉树,用中间结点将他们连接。
  2. 考虑信息的维护过程,我们已经用Rake Tree 将原树切割成了若干个 Compress Tree,也就是若干链,对于一个Compress Node,他的子树中的左右儿子代表的是他的当前子树簇路径的两个端点,而中儿子代表他挂的小簇的端点,这个是Rake下来的,考虑这个就是簇路径之外的点,于是我们可以用这个东西维护簇路径信息和簇信息,考虑我们能够通过expose强制把两个点塞根簇的端点里,也就是说我们可以这样维护路径信息,而子树信息也很好维护,因为我们可以维护子树簇内非子树簇路径的点的权值和,那我们只需要把点 x 做一次 access 之后对 x 的子树的非路径信息做操作,再合并 x 的信息即可,因为 x 是端点,端点的话子树内非簇信息就是子树啊。
  3. Access 操作实际上是这样的,对于一个点他从属于一条 Compress Tree,而 Compress Tree 除非根簇上面都有一个 Rake Node,那么我们需要做得操作就是首先把当前点提到 Compress Tree 的根,然后操縦 Rake Node 到 Rake Tree 的根结点,这个时候我们再把 x 的父亲的父亲提到他所在的 Compress Tree 的根结点,此时如果这个点还有右结点,我们可以直接互换,否则的话我们就把 x 直接点过去并删除当前的 Rake Node。
    而原理也很易懂,考虑Compress Tree要求中序遍历下正好深度由当前钦点的同上层 Compress Tree 相连的结点往下递增,而我们做这样的操作的意思是,如果还有右端点(也就是在上一层的下端结点),就直接交换,将上一层的 Compress Node 作一个连接,相当于是将他的末尾端点引导过来,而上一层如果没有那就是延长末尾到当前簇,那当前簇就没必要再通过 Rake 操作进入树上了,可以直接进入上一层的 Compress Tree,所以我们直接删除当前的Rake结点即可。
    我们都知道根簇应该有两个端点,其中一个是根结点,而 Access(x) 的作用就是使 x 成为根簇中的非根结点端点,这个很有用的,而Makeroot(x) 的作用则是把 x 变成根簇的根结点端点注意到我们是可以控制根簇端点的,着可以让我们维护很多东西!
  4. 连边和删边,其实也很简单,我们先做一下 makeroot(x)将 x 提到根结点,再access(y)将y提到根结点,具体区别见上,然后我们现在就是要在让两个根簇连接在一起,怎么连接呢,考虑相当于是做 compress 操作,x 现在是根结点而 y 现在是末尾,而具体路径结构是怎么接都不会变的,我们的需求是让路径的开头也就是 x和路径的结尾也就是 y 直接接到一起(具体操作是 y 的右儿子接 x)这样就认为连上了边!
    而基簇怎么办?基簇考虑对于Compress Tree,一个原树结点的作用是 Compress 或者是不做(端点),而 我们又知道对于一条边进入 Compress Tree 的方式只能是通过点的代表点,那这里结果就出来了,把基簇放到 x 的左儿子上,这样的话中序遍历合并整体就是对的,具体的合并是很优美的。

可惜 LCT 板子只需要我们维护点权,基簇维护与否我们根本不在乎,而 sone1 看着就炫酷很多啊!!!!太酷了吧,这个!

标签:结点,Tree,Top,Rake,Compress,根簇,端点
From: https://www.cnblogs.com/kisara-no-inu/p/17859885.html

相关文章

  • 面试必刷TOP101:33、二叉树的镜像
    题目题解publicTreeNodeMirror(TreeNodepRoot){if(pRoot==null){returnnull;}TreeNoderoot=newTreeNode(pRoot.val);root.left=Mirror(pRoot.right);root.right=Mirror(pRoot.left);retur......
  • TreeMap
    TreeMap是一个非常有用的数据结构,它实现了SortedMap接口,能够存储键值对,并根据键的自然顺序或者自定义顺序进行排序。TreeMap提供了快速且具有预测性的操作,对于需要有序键值对的场景来说非常适用。插入元素创建TreeMap的最基本方法是使用构造器。以下是一个例子:TreeMap<Integer......
  • vue ztree 的使用
    ztree是一个很经典的基于jquey开发的树结构编辑展示UI组件库。https://gitee.com/zTree/zTree_v3 gitee上有一个很适合vue使用的ztree封装库,https://gitee.com/astinlee_admin/Vue-Giant-Tree/tree/master 但是这个库有个问题。打包后的代码引入到项目中会报错。怎么办......
  • 4-基因家族的系统进化树-基于Windows系统上的iqtree
    今天来讲如何构建系统进化树,使用的软件是iqtree,这是一个基于最大似然法估算的建树软件,可以在Windows系统上运行。1,于此网址“http://www.iqtree.org/”自行下载,并解压。2,将已经鉴定好的自己的基因家族蛋白序列(fasta格式),先用MAFFT网站做多序列比对。我的蛋白序列文件命名是“Ptb......
  • 【11月LeetCode组队打卡】Task4--BinarySearchTree
    Review有数值有序树:lch<root<rch递归和迭代遍历不同于普通二叉树搜索BST700.二叉搜索树中的搜索有:返回以存储val节点为根的子树无:NULLAC1:递归参数和返回值:根节点&待寻值节点终止条件:根为空||匹配到val单层逻辑:有序树:从左到右搜索......
  • Oracle DBA遇到的top150个问题
    作为OracleDBA(数据库管理员),以下是更多常见的Oracle数据库管理中可能遇到的150个问题案例:数据库备份和恢复失败数据库性能下降数据库连接问题长时间运行的查询和死锁数据库服务器崩溃或宕机数据库空间不足数据库日志文件过大数据库表空间损坏数据库安全漏洞数据库版本升......
  • Top 10 Strong Earthquakes in the World
    ChileEarthquake(M=9.5)in1960inminutesputmore2millionspeopleinlostliveorhomesAlaskaEarthquake(M=9.2)in1964RussianEarthquake(M=9.0)in1952JapanEarthquake(M=9.0)in2011,2000peoplediedinminutesIndonesianEarthquake......
  • hutool 使用 TreeUtil 查询树型结构
    之前写过一篇用stream流实现查询树型结构的文章,现在以hutool中的TreeUtil再来实现一次,之前的帖子JavaStream流实现递归查询树型结构查询出所有数据,用父节点递归查询出所有子节点数据/***封装备注分类集合**@paramremarkTypeList备注分类集合*......
  • C# 中增加一个使用StopWatch记录方法执行时间的通用方法
    目录一背景二源码2.1注意事项三使用方法一背景在很多时候我们在进行代码排查的时候需要在日志中记录代码的执行时间从而方便我们进行代码运行效率的执行,我们在日志中准确记录方法的执行时间,这样方便我们进行代码的排查,下面分享一个我们常用的记录方式,方便使用,而且最重要的......
  • 豆瓣电影top250爬取
     <aclass="answer-item_3Zrp6cos-text-body-lgcos-color-bg"href="https://m.baidu.com/sf?atn=index&lid=0&pd=topone_multi&top=%7B%22sfhs%22%3A1%7D&type=cpage&word=%E8%B1%86%E7%93%A3%E7%94%B5%E5%BD%B1top250&key=1v......