Luogu 6177 Count on a tree II/【模板】树分块
分块,但是带 \(\log\)。
先离散化,然后值域就变成 \(O(n)\) 的了。
我们先对每个点维护一个 bitset
,那么显然答案就是 \(u\) 到 \(v\) 路径上所有点的 bitset
或起来后 \(1\) 的个数。
然后可以树链剖分,把链拍成序列,并且对树链剖分后的 dfs
序维护 \(\sqrt{n}\) 个块,查询的时候就相当于 \(O(\log n)\) 个序列查询。对于序列查询,直接预处理整块的 bitset
值,边角暴力即可。复杂度为 \(O(\dfrac{mn\sqrt n\log n}{w})\),很可惜过不了。
发现边角处理的复杂度很低,考虑优化整块查询的时间复杂度。由于块数不超过 \(O(\sqrt n)\),所以我们可以用 \(O(\dfrac{n\sqrt n\log n}{w})\) 的空间开一个 st
表,实现 \(O(\dfrac{n}{w})\) 的区间查询。
复杂度 \(O(\dfrac{n\sqrt n\log n+mn\log n}{w})\),但是众所周知,树剖肯定跑不满,所以能过。