ABC293Ex & ABC298Ex & ABC294Ex 题解
ABC293Ex
题意:用若干条颜色路径覆盖树,使得任意路径的颜色数的最大值最小。
首先可以考虑二分答案 \(K\),变成判定性问题。
考虑树形 DP,设 \(f_{x,0/1/2}\) 表示 \(x\) 子树内的「任意路径的颜色数的最大值」已经小于等于 \(K\) 时,\(x\) 有 \(0/1/2\) 个儿子的颜色与 \(x\) 相同,其值表示以 \(x\) 为端点的「任意路径的路径颜色数的最大值」的最小值。
那么枚举儿子递归,然后考虑这个儿子是否要和 \(x\) 的颜色相同。有转移:
- 当 \(f_{x,i}+f_{v,j}\le K\) 时,\(f'_{x,i}\gets \max(f_{x,i},f_{v,j}+1)\)。
- 当 \(f_{x,i}+f_{v,j}-1\le K\) 时,\(f'_{x,i+1}\gets \max(f_{x,i},f_{v,j})\)。
复杂度 \(O(n\log n)\),注意到根据树链剖分的结论,答案不大于 \(O(\log n)\),复杂度降为 \(O(n\log \log n)\)。
ABC298Ex
很简单的树上 DP 练习题。
找出 \(L_i,R_i\) 的路径上的中点,中点左侧走向 \(L_i\),右侧走向 \(R_i\)。
于是处理出子树大小、每个点到所有点的距离和、每个点到子树所有点的距离和、每个点到子树外所有点的距离和,知道中点后就能 \(O(1)\) 算答案。
通过一些简单的分讨就可以倍增找到路径中点。
复杂度 \(O(n\log n)\)。
ABC294Ex
很奇怪的题。
考虑容斥,枚举边集 \(S(0\le|S|\le m)\),表示指定 \(S\) 中的边的两端点颜色相同,那么设只保留 \(S\) 中的边后原图有 \(c\) 个联通块,则 \(S\) 对答案的贡献为 \(K^c\times (-1)^{|S|}\)。复杂度 \(O(2^m\text{poly(n,m)})\)。
考虑剪枝,我们 dfs 枚举边集,注意到如果当前局面下存在一条边,使得连上这条边后 \(c\) 不变,则继续枚举是无意义的,因为各项的贡献会抵消。
使用不路径压缩的启发式合并的并查集,方便回溯。
复杂度不清楚,但可以通过,开优化后最慢的点跑了五秒多。