[蓝桥杯学习] 树链剖分

定义

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

重链剖分

如何重链剖分

两个dfs

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

操作步骤

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

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

重链剖分的应用

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

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

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

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

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

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

操作步骤:

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

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

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

相关推荐
我的xiaodoujiao4 小时前
API 接口自动化测试详细图文教程学习系列7--相关Python基础知识6
python·学习·测试工具·pytest
山川行4 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio
charlie1145141914 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(2) —— HAL 库获取、启动文件坑位与目录搭建
linux·开发语言·c++·stm32·单片机·学习·嵌入式
知识分享小能手4 小时前
MongoDB入门学习教程,从入门到精通,MongoDB聚合框架(7)
数据库·学习·mongodb
今儿敲了吗5 小时前
算法复盘——前缀和
笔记·学习·算法
啊我不会诶5 小时前
最小生成树
c++·笔记·学习·算法
STLearner6 小时前
AI论文速读 | 元认知监控赋能深度搜索:认知神经科学启发的分层优化框架
大数据·论文阅读·人工智能·python·深度学习·学习·机器学习
Z.风止6 小时前
Large Model-learning(1)
开发语言·笔记·git·python·学习
Be for thing6 小时前
分支管理与冲突解决
git·学习
-To be number.wan6 小时前
PyCharm接入DeepSeek全教程|3种方法+避坑指南
python·学习·pycharm