树链剖分 学习笔记

随便写一点。

1. 原理

定义重儿子为子树内子树大小最大的任一个点,重边为重儿子向其父亲连的边,其余为轻边。

根据定义,轻边的父亲的子树大小一定不小于这个点的子树大小的二倍。又可以证出轻边数量是 \(O(\log n)\) 的。因此可以用线段树维护这个东西。

2. 应用

2.1 dsu

考虑子树算贡献时,每次保留重儿子的贡献。这样的复杂度是 \(O(n\log n)\) 的,因为轻边数量是 \(O(\log n)\) 的。

2.2 lca

考虑两个点跳到同一条重链上,dep 较小的就是 lca。

2.3 套数据结构

首先板子肯定就是用线段树维护一下。

然后就是 CF343D,套个 ODT 板子。

题单:

P7735

P1505

P4315

注意到有些题目可能并不需要树剖,可能可以用树上差分/倍增简单维护。

3. 长链剖分

todo.

posted @ 2024-04-11 21:47  lgh_2009  阅读(6)  评论(0编辑  收藏  举报