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})\),但是众所周知,树剖肯定跑不满,所以能过。

posted @ 2023-07-20 17:20  Ender_32k  阅读(7)  评论(0编辑  收藏  举报