毛毛虫剖分
主要参考:https://www.cnblogs.com/A-Quark/p/16435243.html .
毛毛虫剖分
问题描述
毛毛虫剖分,一种由轻重链剖分(HLD)推广而成的树上结点重标号方法,支持修改 / 查询一只毛毛虫的信息,并且可以对毛毛虫的身体和足分别修改 / 查询不同信息 .
严格不弱于树剖,而且复杂度和树剖一样哦!
一些定义(默认在一棵树上):
- 毛毛虫:一条链和与这条链邻接的所有结点构成的集合 .
- 虫身(身体):毛毛虫的链部分 .
- 虫足(足):毛毛虫除虫身的部分 .
重标号方法
- 首先重剖求出重链 .
- DFS,若现在处理到结点 \(u\):
- 若 \(u\) 还未被标号,则为其标号 .
- 若 \(u\) 是重链头,遍历这条重链,将邻接这条链的结点依次标号 .
- 先递归重儿子,再递归轻儿子 .
重标号性质
- 对于重链,除链头外的结点标号连续 .
- 对于任意结点,其轻儿子标号连续 .
- 对于以重链头为根的子树,与这条重链邻接的所有结点标号连续 .
这样就可以随便维护毛毛虫信息了,顺便还能维护链信息,子树信息等 .
时间复杂度同轻重链剖分 .
例题
NOI2021 轻重边
一棵 \(n\) 个点的树,\(m\) 次操作:
- 对一条毛毛虫身体染黑色,足部染白色 .
- 查询一条链上的黑边数量 .
\(n,m\le 10^5\) .
直接剖,\(O(m\log^2 n)\) .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16440764.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ