新高一暑假第一期集训恢复性训练【DP版块】(补)
新高一暑假第一期集训恢复性训练【DP版块】(补)
A. [CEOI2017] MUSEUM
树形 dp。
设 \(f_{i, j},g_{i, j}\) 表示以 \(i\) 为根的子树中,访问了 \(j\) 个点,回到 \(i\) 和不必回到 \(i\) 的代价。
转移的时候做类似于背包一样的东西。
时间复杂度 \(\Theta(n^2)\)。
B. [ABC207F] Tree Patrolling
设 \(f_{i, j, 0/1/2}\) 分别表示以 \(i\) 为根的子树保护了 \(j\) 个点的方案数,未放置自己,且没被子节点保护;未放置自己,但被子节点保护;放置了自己 这三种情况。
转移从所有子节点的状态转移过来比较好想。然后主要有一点就是会存在增加新节点的情况。
- 自己没有放置,但是被子节点覆盖了。
- 子节点没有放置,但是被父节点覆盖了。
转移是树型背包。理论上时间复杂度为 \(\Theta(n^3)\)。
优化:
- 动态维护 \(size\),这样就可以保证每对点都在 LCA 处合并了一次 \(\rightarrow\) \(\Theta(n\log n)\)。
- 为了去除重复记录方案的情况,每次转移开个空数组记录答案。
C. [Atcoder dpV] Subtree
换根 dp。
设 \(f_i\) 表示以 \(i\) 为根的子树,\(i\) 为黑色的合法方案数。(全局是以 \(1\) 为根的)
则有 \(\displaystyle f_u = \prod\limits_{v\in son_u} (f_v + 1)\),加 \(1\) 是整棵子树全为白色的方案数。
设 \(g_i\) 表示以 \(i\) 为根的子树,\(i\) 为黑色的方案数。(这里的子树代指的是 \(i\) 的祖先以及兄弟,即去掉 \(i\) 原来子树的剩余部分)
答案为 \(f_i \times g_i\)。考虑如何求出 \(g_i\)。
对于一对父子关系 \(\displaystyle f_u = \prod (f_{son} + 1)\),其中就有儿子提供的一个贡献 \(f_v + 1\),我们需要去掉。
于是得出:\(\displaystyle g_v = g_u \times \frac{\prod (f_{son} + 1)}{f_v + 1}\)。
但是模数不保证是质数,所以不能求逆元。
我们可以对于每个 \(u\) 维护出儿子贡献 \(\prod (f_v + 1)\) 的前缀积以及后缀积。只要知道某个儿子在其儿子中的便后即可。

浙公网安备 33010602011771号