首页 > 其他分享 >LCT

LCT

时间:2025-01-14 20:59:43浏览次数:1  
标签:LCT 辅助 实链 原树 Splay 维护

1 概述

首先我们需要知道一类问题,在这类问题中我们需要维护一个森林,支持加边和删边操作,然后要求维护树上的一些信息。这类问题称为动态树问题。

而 LCT,即 Link-Cut Tree,就是用于解决动态树问题的一种数据结构。

学习 LCT 之前需要对 Splay 这种平衡树有一定了解,当然两者在细节上还有一些差别。

2 实链剖分

我们先来看看如果不要求动态加边删边怎样做。假如给出一道这样的问题:

  • 修改一个点的点权。
  • 查询路径 \(x\to y\) 上点的点权异或和。

显然这个问题可以轻松用树链剖分解决掉。接下来我们加入加边删边操作之后普通的树链剖分就难以维护了,原因就在于树结构改变的同时树链剖分出来的重链也会改变。

考虑树剖维护链上操作的本质,我们其实就是给同一条重链上的点赋上连续的 \(\text{dfn}\) 编号,并且保证每个点到根节点经过的重链数量是 \(O(\log n)\) 级别的,然后再利用其他数据结构维护。

在动态树问题中,我们困难的地方就是对树时刻维护这样的链,上面已经说过树剖难以维护,所以我们更希望这个重链是由我们自行决定的。换句话讲,我们希望对每个节点自行指定重儿子和轻儿子然后进行维护。

这种划分方式就被称为实链剖分,而我们自行指定的儿子叫做实儿子和虚儿子(需要注意的是一个点不一定必须有实儿子)。然后整棵树就可以被划分成若干实链,接下来我们就需要利用 Splay 去维护每一条链。

然后我们就需要考虑怎样去维护这些链,我们还需要引入另一个东西。

3 辅助树

辅助树实际上就是维护每条链的 Splay 之间通过某种方式相连形成的树结构。可以理解为 Splay 维护的是每一条实链,而辅助树维护的就是一棵树;将一些辅助树放在一起就构成了 LCT,用于维护整个森林。

现在我们来看辅助树的性质:

  • 辅助树有多个 Splay 组成,每个 Splay 维护原树的一条实链,且 Splay 的中序遍历对应实链从上到下的点。
  • 辅助树上的 Splay 通过如下方式连成一棵树:对于一棵 Splay,其根节点的父亲指向其对应维护的实链的链顶的父亲。同时对于我们指向的这个点,我们仍然让它在辅助树上的儿子为空,以此表示这条边是虚边。也就是说,所有的虚边都是认父不认子的。
  • 原树上的操作均可以转化为在辅助树上操作,所以接下来我们只需要考虑在辅助树上的操作即可。

举个例子,对于如下所示的原树:

其辅助树结构可能如下(显然这个结构会随 Splay 形态变化):

然后我们来看一下原树和辅助树的关系:

  • 原树的实链都在辅助树的同一个 Splay 中。
  • 原树的虚边由儿子所在 Splay 的根节点指向父亲,但是这个点不指向根节点。
  • Splay 上最多有两个实儿子,但是可能会有很多虚儿子。
  • 原树的根不等于辅助树的根;原树上的父亲指向不等于辅助树上的父亲指向。

接下来就可开始实现 LCT 的基本操作了。

4 具体实现

4.1 Splay 基本操作

标签:LCT,辅助,实链,原树,Splay,维护
From: https://www.cnblogs.com/UKE-Automation/p/18666065

相关文章

  • 一种调试 线段树 / Treap / Splay / 左偏树 / LCT 等树形结构的技巧
    前言如果我们需要观察程序运行过程中,某一个变量、某一个序列的变化情况,你可以在修改的地方打断点debug,或者直接在需要的地方输出就行了。但是对于一些树形结构,我们不好将其直观地呈现出来,常常只是输出每一个结点的值,但是这就丢失了结点之间的连边情况。有时候不得不手动画图。......
  • 常用的 journalctl 命令总结
    copyfrom  https://zhuanlan.zhihu.com/p/722001166 journalctl是一个用于查看由systemd收集的系统和服务日志的工具。1.查看所有日志journalctl2.实时查看日志(类似于tail-f)journalctl-f3.按服务查看日志查看特定服务的日志journalctl-u<服务名>例如,查看nginx......
  • 【命令操作】查看和分析系统各类日志--journalctl
    原文链接:【命令操作】查看和分析系统各类日志–journalctl|统信|麒麟|方德Hello,大家好啊!今天给大家带来一篇关于Linux系统上journalctl命令详解的文章。journalctl是systemd的日志查看工具,用于查看和管理系统日志,包括内核消息、服务日志、用户日志等。通过journalctl......
  • LCT 优化 Dinic
    我觉得这东西有必要记一下,因为光是看PPT很难自己写出代码……具体步骤相关啥都没写。另外学这个东西也不是很必要……Solution我们需要一个维护最小值、最小值编号,支持区间加的LCT。需要支持以下操作:\(find\_root(u)\)\(link(u,v)\)\(cut(u,v)\)\(find\_min(v)\)\(add......
  • journalctl -k 查看驱动输出信息
    Aug2307:07:16ubuntukernel:JWNetFilter:loadingout-of-treemoduletaintskernel.Aug2307:07:16ubuntukernel:JWNetFilter:moduleverificationfailed:signatureand/orrequiredkeymissing-taintingkernelAug2307:07:16ubuntukernel:JWNetFilte......
  • LCT小记
    简介LCT是常用的一种动态树。对于一般的树上问题,我们会用树剖解决,但是如果遇到动态增删边的问题就需要LCT来解决。LCT的本质上是一种链剖分,我们将所有的边剖分为虚边和实边,所以整棵树是由若干条实链构成的,实链之间用虚边相连。我们通过splay来维护实链的信息,并以从上到下......
  • Journalctl命令常见用法
    1、查询指定时间范围内的日志journalctl--since"2023-01-0100:00:00"--until"2023-01-0223:59:59"journalctl-usshd--since"2023-05-01"--until"2023-5-31"-n202、查询指定系统单元服务的日志journalctl-unginx--sinceyesterdayjournalc......
  • R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化|附代码数据
    全文下载链接: http://tecdat.cn/?p=26105 最近我们被客户要求撰写关于LCTM的研究报告,包括一些图形和统计输出。在本文中,潜类别轨迹建模(LCTM)是流行病学中一种相对较新的方法,用于描述生命过程中的暴露,它将异质人群简化为同质模式或类别。然而,对于给定的数据集,可以根据类的数......
  • vue3+node.js+mysql+electron+express实现用户登录,文章写入删除,全量更新,增量更新,和截
    第一件事情是安装node.js,去官网下,在终端node-v,npm-v有版本号就行了,不必搞环境配置,保姆级别教程,感谢哥有时间。嘻嘻,祝大家开心。1.首先你要创建electron项目打开vscode,新建终端输入代码npminit这个代码是初始化的意思会生成一个文件package.json里面的代码应该是这......
  • [LCTF 2018]bestphp's revenge php原生类的利用以及php_session反序列化相关
    今天继续来一道反序列化的题目。点击查看代码<?phphighlight_file(__FILE__);$b='implode';call_user_func($_GET['f'],$_POST);session_start();if(isset($_GET['name'])){$_SESSION['name']=$_GET['name'];}var_dump......