新高一暑假第一期集训恢复性训练【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\) 个点的方案数,未放置自己,且没被子节点保护;未放置自己,但被子节点保护;放置了自己 这三种情况。

转移从所有子节点的状态转移过来比较好想。然后主要有一点就是会存在增加新节点的情况。

  1. 自己没有放置,但是被子节点覆盖了。
  2. 子节点没有放置,但是被父节点覆盖了。

转移是树型背包。理论上时间复杂度为 \(\Theta(n^3)\)

优化:

  1. 动态维护 \(size\),这样就可以保证每对点都在 LCA 处合并了一次 \(\rightarrow\) \(\Theta(n\log n)\)
  2. 为了去除重复记录方案的情况,每次转移开个空数组记录答案。

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)\) 的前缀积以及后缀积。只要知道某个儿子在其儿子中的便后即可。

posted @ 2024-10-20 19:23  Leirt_Abu  阅读(24)  评论(1)    收藏  举报