[虚树] [线段树合并] P5327 [ZJOI2019] 语言
posted on 2025-05-06 09:57:49 | under | source
题意:\(n\) 个点的树,给出 \(m\) 条路径 \(s_i\to t_i\),求有多少点对满足在同一条路径上出现。\(n,m\le 10^5\)。
这题做法多样,这是一种简单 \(O(n\log n)\) 算法。
考虑对一个点求出能到达其它哪些点,将包含它的路径的两端点挑出来作为关键点,答案即为其关键点最小生成树大小,也可以说是虚树在原树上大小。
考虑构建虚树的算法,为了方便可以先定根为关键点然后再减去虚树顶端到根的距离。那么按 dfs 序排序后每次增加当前点到它和上一个点的 \(lca\) 的距离。
这个东西不难用线段树维护,并且支持单点修改。那么答案呼吁而出,通过差分的方式加入关键点,然后线段树合并即可。
假如用 st 表求 \(lca\) 就能做到 \(O(n\log n)\)。

浙公网安备 33010602011771号