思路来源
https://blog.nowcoder.net/n/5eaebd22f5f846838c637bc337cc1ee9
https://blog.youkuaiyun.com/litble/article/details/87965999
知识点整理
长链剖分,用于维护子树中只与深度有关的信息,多用于静态
从任何一个点往上跳到根,最多经过条不同的长链。
长链剖分,顾名思义,每个点维护子树中最长的那一条链,
[l[x],l[x]+len[x]-1]是其长链区间,到l[x]的偏移量也确定了它的深度
和dsu on tree类似,但若干条链分别占用不同位置的数组空间,只有相同链的内存共用,
所以不用像dsu on tree那样清空内存,所以预处理长链长度之后,只需要三步
①搜长儿子,继承长儿子的答案
②把短儿子往长儿子上挂,计算短儿子的答案
③把自己这个节点挂上去
由于若干条长链不交,每个点在向上合并的时候,只会作为短链出现在一条链里,所以是O(n)的
似乎还是指针版的略快一点,然而习惯用数组下标写……
题目
n(n<=1e6)个点的树,
对于每个点,求其子树中出现节点最多的深度d,
如果存在多个深度,它们的节点个数相同,则返回最小的哪个

博客介绍了长链剖分这一数据结构优化技术,用于维护树中与深度相关的子树信息。通过长链剖分,可以高效地在O(n)时间内解决求解子树中最深节点个数的问题。文章详细阐述了长链剖分的原理、步骤,并给出了相应的C++代码实现。此外,还提供了题目示例和解题思路。
最低0.47元/天 解锁文章
1933

被折叠的 条评论
为什么被折叠?



