树链剖分 学习笔记

apple365:这个东西没有不可替代的作用

重链剖分

按照重儿子和轻儿子划分。
第一遍 dfs 求出 siz[],fa[],dep[],son[]
第二遍打 dfn
每次走重儿子会走出一条重链。之后再轻链里面走重儿子又可以把整棵树划分成若干条链。
性质:

  1. 每一条链都是轻儿子开始,然后都是重儿子。
  2. 每一条链的 DFS 序是连续的。
  3. 每一颗子树的 DFS 序是连续的。

应用:

  1. LCA(x,y):
  • 检查 xy 是否在同一条链上。若是,深度小的是 LCA。若不是,每次跳 dep[top[cur]] 更大的。
  1. 求两点之间路径长度。
  2. 将链或者子树转化成区间+数据结构。

长链剖分:

对于一颗树,将节点按照子树内的深度剖分,把深度最深的子树对应的子节点视为重儿子。
一条长链:由顶端点(轻儿子)+若干重儿子构成。
性质:

  1. 一条长链的末端点一定是所在子树深度最大的节点。
  2. 树上节点 curk 级祖先(k0 开始)所在长链的长度一定大于 k
  3. 树上任意节点 cur 到根节点经过的轻边数不超过 n
posted @   Forever1507  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示