[蓝桥杯学习] 树链剖分

定义

将树分割成若干条链,以维护树上的信息,若无特殊需求,一般是重链剖分。

重链剖分

如何重链剖分

两个dfs

第一个dfs是预处理各个结点的基本信息,第二个dfs是利用信息进行剖分(dfs序)

操作步骤

第一次dfs
  1. 更新当前结点信息(子树个数、父结点信息、深度)
  2. 对子结点进行dfs
  3. 子结点dfs之后,把子结点的子树个数加到父结点,更新重儿子。
第二次dfs

因为dfs序连续的值是一条链,所以,我们需要让树在进行dfs时,优先对重儿子进行dfs,之后再对其它轻儿子进行dfs

重链剖分的应用

将剖分的重链放在线段数组或者树状数组上,然后在这个数据结构上进行维护。

对某条链上的节点进行更新

用数据结构对节点信息进行维护,进行区间查询,区间更新。

对某节点子树进行更新/查询

由dfs序可知,某节点的入序和出序之间的连续数就是该节点的子树。

查询两节点的最近公共祖先LCA

操作步骤:

  1. 当两节点不在同一条链上时,选择深度更浅的结点,跳到父链(链首的父结点)
  2. 当两节点在同一条链上时,深度更浅的点就是最近公共祖先LCA

查询、修改两节点之间路径的信息

主体还是寻找LCA,就是如果跳到父链(或是其它点),把x到它首结点(其它点)之间结点信息进行更新。

相关推荐
2303_Alpha1 天前
SpringBoot
笔记·学习
萘柰奈1 天前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽1 天前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫1 天前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
向阳花开_miemie1 天前
Android音频学习(十八)——混音流程
学习·音视频
工大一只猿1 天前
51单片机学习
嵌入式硬件·学习·51单片机
c0d1ng1 天前
量子计算学习(第十四周周报)
学习·量子计算
Hello_Embed2 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中2 天前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h2 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa