首页 > 其他分享 >[学习笔记] 树链剖分

[学习笔记] 树链剖分

时间:2023-10-04 23:12:21浏览次数:40  
标签:剖分 text top 笔记 树链 dfn tot 重链 节点

叫复习笔记或许更好。

树链剖分就是把树剖成链去解决一些问题。

定义

  • 重子节点:子节点中子树大小最大的节点。
  • 轻子节点:除重子节点外的其他子节点。
  • 重边:到重子节点的边。
  • 轻边:到轻子节点的边。

记号

  • \(dfn[x]\):DFS 序,也是在线段树中的编号。
  • \(son[x]\):重子节点。
  • \(dep[x]\):深度。
  • \(siz[x]\):子树大小。
  • \(top[x]\):链顶。
  • \(fa[x]\):父节点。

实现

跑两边 DFS 就可以把这些信息全部求出来了。

应用

image

这就是精华。

维护路径信息

你会发现,每条重链的 \(dfn[x]\) 是连续的,所以我们要维护路径 \((x,y)\) 的信息时,直接暴力将节点深度最大的那个跳到链顶维护信息,直到跳到同一条链上为止。

这是路径求和的伪代码。

\[\begin{array}{l} \text{TREE-PATH-SUM }(u,v) \\ \begin{array}{ll} 2 & \textbf{while }u.top\text{ is not }v.top \\ 3 & \qquad \textbf{if }u.top.deep< v.top.deep \\ 4 & \qquad \qquad \text{SWAP}(u, v) \\ 5 & \qquad tot\gets tot + \text{sum of values between }u\text{ and }u.top \\ 6 & \qquad u\gets u.top.father \\ 7 & tot\gets tot + \text{sum of values between }u\text{ and }v \\ 8 & \textbf{return } tot \end{array} \end{array} \]

维护子树信息

你会发现,一棵子树内的 \(dfn[x]\) 是连续的,所以我们只需要修改 \(dfn[x],\dots,dfn[x]+siz[x]-1\) 的信息即可。

求最近公共祖先

不断向上跳重链,当跳到同一条重链上时,深度较小的结点即为 LCA。

向上跳重链时需要先跳所在重链顶端深度较大的那个。

扩展

点权->边权?

有的题目不再要求维护节点上的信息而是边上的,这种该如何操作?

很简单,把 \((x,y)\) 这条边的信息赋给深度更小的那个节点,然后正常做就好了,正确性显然。


咕咕咕

标签:剖分,text,top,笔记,树链,dfn,tot,重链,节点
From: https://www.cnblogs.com/y1wei/p/shu_lian_pou_fen.html

相关文章

  • [学习笔记] Tarjan 连通性全家桶
    拜谢陈老师的PPT!!!无向图割点若点\(x\)不为搜索树的根节点,则\(x\)是割点当且仅当搜索树上存在一个\(x\)的子节点\(y\)满足:\(dfn_x\lelow_y\)。特别地,当\(x\)是搜索树的根节点时,则\(x\)是割点当且仅当有两个点\(y_1,y_2\)满足上述条件。割边边\((x,y)\)是......
  • 笔记——线段树
    蓝月の笔记——线段树篇在树状数组中,我们讲解了关于单点修改区间查询的操作。今天,我们要讲一种更加高级的数据结构,他解决的是区间修改区间查询的问题多了一个区间当然更高级啦。这个数据结构就是——线段树Luogu-P3372给定一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)......
  • Linux运维学习笔记
    此笔记为学习https://www.bilibili.com/video/BV1nW411L7xm/?vd_source=3f851e85e66ef33269a2eefee664cec2的学习记录,目前持续更新中,希望能找到运维的实习吖 O(≧▽≦)OLinux的终端终端组成部分Linux关机命令shoutdown-hnow(正常关机)halt(关闭内存)init0使用VMware备......
  • 活动报名与缴费小程序开发笔记一
    项目背景活动报名与缴费小程序的开发背景主要源于以下几个因素:1.数字化时代的需求:随着移动互联网和智能手机的普及,人们习惯使用手机进行各种活动。传统的纸质报名表格和线下缴费方式变得相对繁琐,而数字化报名与缴费小程序提供了更便捷的解决方案。2.提高效率和减少人力成本:对于活......
  • 流畅的python笔记 (二) 2.序列构成的数组
    内置序列类型分类1:容器序列(能存放不同类型):list,tuple,collections.deque扁平序列(不能存放不同类型):str,bytes,bytearray,memoryview,array.array分类2:可变序列(能被修改):list,bytearray,array.array,collections.deque,memoryview不可变序列:tuple,str,bytes列表推导......
  • Python笔记
    第一章、Python概述1.1 扩展库安装方法使用pip命令安装扩展库。在cmd命令行中输入pip,回车后可以看到pip命令的使用说明。1.2 常用的pip命令pip命令示例说明pipfreeze[>requirements.txt]列出已安装扩展库及其版本号(不知道怎么用。。?)pipinstallSomePacka......
  • 【做题笔记】dp,但是国庆限定版
    Day1方块消除传送门看到这个数据范围就可以猜测正解是\(O(n^4)\)的dp,与这个差不多相符合的可以想到区间dp。然后大胆猜测一下就是区间dp,令\(dp[i][j]\)表示消除掉\([i,j]\)后的最大价值,这个显然可以从长度更短的区间转移过来。所以此题我们可以从区间dp的方向思考......
  • 《敏捷软件需求》阅读笔记一
    以下是关于敏捷软件需求这本书籍的前八章的阅读心得体会,涵盖了每章的主要观点和个人体会:第一章:敏捷方法概述    第一章介绍了敏捷方法的起源和核心原则,其中最关键的原则是个体与交互、工作的软件、客户合作和响应变化。我学到了敏捷方法的灵活性和迭代开发是应对不断变化......
  • HTML学习笔记——简单介绍
    什么是HTMLHTML:HyperTextMarkupLanguageHTML是一种用来告知浏览器如何组织页面的标记语言。其由一系列的元素组成,这些元素用来包围或者标记不同部分的内容,让它以某种方式呈现或者工作。简单拆分一个HTML元素观察下面一个HTML元素<p>HelloWorld!</p><p>HelloWo......
  • Java 学习笔记一
    dos环境下(Windows即cmd)的Java命令先用javac文件名.java;命令,编译java文件,生成一个后缀为class、名与类名相同的文件。再用java类名命令,执行文件。注释当类名前的修饰符为public时,类名必须和源文件名一致。并且以上操作不能执行带package的java文件。和C......