[THUPC 2024 初赛] 一棵树

[THUPC 2024 初赛] 一棵树 - 洛谷P9962

首先有一个暴力的树形 DP,令 \(dp_{u, i}\) 表示 \(u\) 的子树内有 \(k\) 个黑点的最小权值。

考虑 \(dp_u\)\(dp_v(v \in son_u)\) 合并,那么有 \(dp_{u, i} = \min\{ dp_{v, j} + |k - 2j| + dp_{u, i - j} \}\)

\(f_{v, j} = dp_{v, j} + |k - 2j|\),那么 \(dp_{u, i} = \min\{f_{v, j} + dp_{u, i - j}\}\),很显然是一个闵可夫斯基和的形式(归纳可证 \(f, dp\) 均为下凸函数),于是我们考虑维护 \(dp, f\) 的差分数组 \(\Delta f, \Delta dp\)

考虑 \(\Delta f_v\)\(\Delta dp_v\) 之间的联系,需要分两种情况讨论:

  • \(k\) 是偶数,当 \(i \le \frac{k}{2}\) 时,\(\Delta f_{v, i} = \Delta dp_{v, i} - 2\);否则 \(\Delta f_{v, i} = \Delta dp_{v, i} + 2\)
  • \(k\) 是奇数,当 \(i \le \frac{k - 1}{2}\) 时,\(\Delta f_{v, i} = \Delta dp_{v, i} - 2\);当 \(i = \frac{k + 1}{2}\) \(\Delta f_{v, i} = \Delta dp_{v, i}\);否则 \(\Delta f_{v, i} = \Delta dp_{v, i} + 2\)

总之就是对于一个前缀 \(-2\),一个后缀 \(+2\)

我们可以使用一个堆维护 $i \le \frac{k}{2} $ 的部分,一个 vector 维护剩下的部分(\(i = \frac{k + 1}{2}\) 需要单独考虑),然后打两个 \(tag\) 即可。合并时使用启发式合并即可。(注意加减 \(tag\))如果堆内元素数量 \(> \frac{k}{2}\),把堆顶的丢进 vector 即可。

时间复杂度:\(O(n \log ^ 2 n)\)

使用 Minkowski 优化 DP 的一种套路吧。

posted @ 2025-12-16 21:51  xiehanrui0817  阅读(6)  评论(0)    收藏  举报