毛毛虫剖分

主要参考:https://www.cnblogs.com/A-Quark/p/16435243.html .

毛毛虫剖分

问题描述

毛毛虫剖分,一种由轻重链剖分(HLD)推广而成的树上结点重标号方法,支持修改 / 查询一只毛毛虫的信息,并且可以对毛毛虫的身体和足分别修改 / 查询不同信息 .

严格不弱于树剖,而且复杂度和树剖一样哦!

一些定义(默认在一棵树上):

  • 毛毛虫:一条链和与这条链邻接的所有结点构成的集合 .
  • 虫身(身体):毛毛虫的链部分 .
  • 虫足(足):毛毛虫除虫身的部分 .

重标号方法

  1. 首先重剖求出重链 .
  2. DFS,若现在处理到结点 \(u\)
  3. \(u\) 还未被标号,则为其标号 .
  4. \(u\) 是重链头,遍历这条重链,将邻接这条链的结点依次标号 .
  5. 先递归重儿子,再递归轻儿子 .

重标号性质

  • 对于重链,除链头外的结点标号连续 .
  • 对于任意结点,其轻儿子标号连续 .
  • 对于以重链头为根的子树,与这条重链邻接的所有结点标号连续 .

这样就可以随便维护毛毛虫信息了,顺便还能维护链信息,子树信息等 .

时间复杂度同轻重链剖分 .

例题

NOI2021 轻重边

一棵 \(n\) 个点的树,\(m\) 次操作:

  • 对一条毛毛虫身体染黑色,足部染白色 .
  • 查询一条链上的黑边数量 .

\(n,m\le 10^5\) .

直接剖,\(O(m\log^2 n)\) .

代码:https://loj.ac/s/1557272 .

posted @ 2022-07-03 20:24  Jijidawang  阅读(645)  评论(3编辑  收藏  举报
😅​