ABC329G Solution

· · 题解

要求每条边经过恰好两次,实质上相当于 DFS 整棵树。那么不同的遍历方案就相当于需要 安排每个儿子数恰好为 \boldsymbol 2 的顶点的儿子 DFS 顺序

确定了遍历顺序后,对答案的统计是容易的:先判断对每个 s_i 都能走到 t_i,然后进行区间加,判断全局最大值是否不超过 k

考虑这个过程中,每条边被遍历次数的下界。显然对每个 s_i \to t_i 路径,仅有路径上的边一定会被遍历次数 +1(注意 x \to yy \to x 不是同一时刻被遍历的边,自然 不被视作是同一条边(u, v) 实际的被遍历次数的最大值是向上次数和向下次数的较大值,而非和)。对于某特定的遍历顺序,我们将其路径拆分为两段:

这是以子树为单位的遍历次数增加;考虑将子树内每条边被遍历次数的最大值记录入状态,则发现这个信息是可以从下向上合并的。

可以预处理增加量:设 c_1(i) 表示若 i 是第一个被遍历的儿子,则其兄弟的子树得到的增加量,c_2(i) 同理。c 可以直接用树上差分计算。

此时直接 DP 即可:令 dp_{i,j} 计数,仅考虑点 i 的子树内,边最大被遍历次数等于 j 的方案数。

还需要考虑一个细节:对于一个 s \to t非祖先-后代链 要求,这本质上已经要求了 \operatorname{lca}(s, t) 的两个儿子 DFS 顺序固定,否则必然不能从 s 走到 t。在求 LCA 的过程中额外记录一下即可。

时间复杂度 O((N+M)\log N + NK)