轻重链剖分/长短链剖分
有时,我们要在树上进行操作。
链操作比较容易维护。
由于链每个点只有一个前驱和后继,所以可以直接使用数据结构维护。
但是树上就难以维护。
可以考虑把树分解成若干条链。这样子就把树的问题转化成了链的问题。
定义一个点的偏好儿子。
除了叶子节点以外,每个节点有且只有一个。
定义链顶为每条链的顶端。
从顶端一直沿着走,能够走到链上的每一个节点。
轻重链剖分主要用于处理树上的操作。
确定的方法是:按照每个节点的大小,被设为节点大小最大的节点。
这样子,如果从一个点跳到链顶,再跳到父亲,跳过的边都是轻重交替的。
如果跳过一个轻边,则由于他的父亲有一个大小比当前点更大的儿子,所以每次跳过轻边,的子树大小都。
所以跳的时间复杂度是的。
这个性质十分优秀,使得轻重链剖分可以嵌套其他数据结构。
长短链剖分划分偏好儿子的方法是把子树深度最大的点作为偏好儿子。
如果使用长短链剖分维护树上信息,
设当前节点的最大深度为d,
则由于他的当前点有一个深度比d更大的儿子,所以每次跳过轻边,的子树大小至少,随后d++。
这样子时间复杂度最坏情况是的。
所以用长短链剖分处理树上链信息问题十分不优秀。
但是长短链剖分可以用于处理一些求子树和深度有关的信息。
虽然这些信息可以使用线段树求出,但是长短链剖分的时间复杂度更低。
如果维护一个子树深度=d的点,可以dp。
设表示x子树深度为i的点。
显然枚举x的一个儿子y,
这样子时间复杂度是平方级的。
但是如果我们先把当前节点继承偏好儿子的结果,再把非偏好儿子的结果加在当前儿子上。
则时间复杂度是所有长链的长度和,即。
轻重链剖分例题:
天天爱跑步
树的统计
打击目标
人造情感(没做)
NOI2014 购票(非正解)
SDOI2017 树点涂色
数星星
border的四种求法
[ZJOI2018]历史(忘了)
[SDOI2017]切树游戏
[LNOI2014]LCA
保卫王国
[WC2020]有根树
loj 黄金矿工(没做)
UOJ53
CF757G
长短链剖分例题:
dominant indices
树上的鼠(忘了)
[POI2014]hotel
重建计划
希望(没做)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥