轻重链剖分/长短链剖分

有时,我们要在树上进行操作。
链操作比较容易维护。
由于链每个点只有一个前驱和后继,所以可以直接使用数据结构维护。
但是树上就难以维护。
可以考虑把树分解成若干条链。这样子就把树的问题转化成了链的问题。
定义一个点x的偏好儿子px
除了叶子节点以外,每个节点x有且只有一个px
定义链顶tp为每条链的顶端。
从顶端一直沿着px走,能够走到链上的每一个节点。
轻重链剖分主要用于处理树上的操作。
确定p的方法是:按照每个节点的大小,px被设为x节点大小最大的节点y
这样子,如果从一个点x跳到链顶,再跳到父亲,跳过的边都是轻重交替的。
如果跳过一个轻边,则由于他的父亲有一个大小比当前点更大的儿子,所以每次跳过轻边,x的子树大小都=2
所以跳的时间复杂度是log2n的。
这个性质十分优秀,使得轻重链剖分可以嵌套其他数据结构。
长短链剖分划分偏好儿子的方法是把子树深度最大的点作为偏好儿子。
如果使用长短链剖分维护树上信息,
设当前节点的最大深度为d,
则由于他的当前点有一个深度比d更大的儿子,所以每次跳过轻边,x的子树大小至少+=d+1,随后d++。
这样子时间复杂度最坏情况是O(n)的。
所以用长短链剖分处理树上链信息问题十分不优秀。
但是长短链剖分可以用于处理一些求子树和深度有关的信息。
虽然这些信息可以使用线段树求出,但是长短链剖分的时间复杂度更低。
如果维护一个子树深度=d的点,可以dp。
fx,i表示x子树深度为i的点。
显然枚举x的一个儿子y,fx,i+=fy,i1
这样子时间复杂度是平方级的。
但是如果我们先把当前节点继承偏好儿子的结果,再把非偏好儿子的结果加在当前儿子上。
则时间复杂度是所有长链的长度和,即O(n)

轻重链剖分例题:
天天爱跑步
树的统计
打击目标
人造情感(没做)
NOI2014 购票(非正解)
SDOI2017 树点涂色
数星星
border的四种求法
[ZJOI2018]历史(忘了)
[SDOI2017]切树游戏
[LNOI2014]LCA
保卫王国
[WC2020]有根树
loj 黄金矿工(没做)
UOJ53
CF757G
长短链剖分例题:
dominant indices
树上的鼠(忘了)
[POI2014]hotel
重建计划
希望(没做)

posted @   celerity1  阅读(294)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示