Loading

[CF 1914F] Programming Competition

前言

还是感觉到了一些不对啊, 自己推导的能力需要加强

思路

题意很清楚

题意

给定一个 nn 个点的树, 每个点父亲 pip_i
求最多可以找到多少二元对 (u,v)(u, v), 使得每个点都仅属于至多一个二元对, 且 u,vu, v 互相不为祖先

猜测是树形 \(\rm{dp}\)
考虑在 \(\rm{LCA}\) 处统计点对
不妨先令 \(f_{u, k}\) 表示 \(u\) 子树中, 还剩下 \(k\) 个点没有被匹配的点的可达性
考虑怎么转移?

考虑对于 \(\mathbb{S} = \forall v \in \textrm{son}(u)\), 不难发现 \(\mathbb{S}\) 中不同子树都可以匹配

现在问题转化为, 对于数集 \(\{\alpha_1, \alpha_2, \alpha_3, \cdots, \alpha_{|\mathbb{S}|}\}\), 求最优的匹配方式使得剩下的数集中的数和最小
这是经典问题, 不难发现如果数集中不存在超过和一半的数, 那么一定是最优匹配, 否则就仅跟这个数有关
直接做合并是 \(\mathcal{O}(n^2)\) 的, 考虑优化

只能从本质上进行优化, 发现一个关键性质, 对于状态 \(f_{u, k} = 1\), 必定有 \(f_{u, k' \geq k} = 1\), 其中 \(k'\)\(k\) 奇偶性相同的\((\)没考虑到这个\()\)
所以考虑直接处理最小的没被匹配的点的个数记为 \(f_u\), 但是怎么转移呢?

首先记 \(\max f_{v \in \textrm{son}(u)}\) 对应的 \(v\)\(v_0\), 那么倘若 \(\sum_{v \in \textrm{son}(u), v \neq v_0} siz_v < f_{v_0}\), 不难发现一定是 \(v_0\) 与外界匹配
否则如果 \(\sum_{v \in \textrm{son}(u), v \neq v_0} siz_v \geq f_{v_0}\), 应该怎么做?

为了方便理解, 下面具体分析这个子问题

子问题

问题: 给定大小为 nn 的不定数集 α={[L1,U1],[L2,U2],[L3,U3],,[Ln,Un]}\alpha = \Big\{[L_1, U_1], [L_2, U_2], [L_3, U_3], \cdots, [L_n, U_n]\Big\}, 定义一次匹配为 αiαik,αjαjk\alpha_i \gets \alpha_i - k, \alpha_j \gets \alpha_j - k, 其中 ij,kmin(αi,αj)i \neq j, k \leq \min(\alpha_i, \alpha_j), 求多次匹配操作之后, 最小化 α\alpha 中的和

其中 Li,UiL_i, U_i 奇偶性相同

要求复杂度达到 O(n)\mathcal{O} (n)

问题显然是困难的, 因为同时涉及到了不定数集的取值, 以及匹配问题的最优解构造.
一个显而易见的部分是

  • Li>jiUj\exists L_i > \sum_{j \neq i} U_j
    不难发现这种情况下显然用 LiL_i 去匹配其他的 UjU_j 是最优的.
    补充一下, 你会发现 LiL_i 至多存在一个

剩下

  • LijiUj\forall L_i \leq \sum_{j \neq i} U_j
    这种情况下如何处理?
    猜测想办法最终只留下 010 \sim 1
    不难发现最优答案应当为 i=1nUi mod 2\sum_{i = 1} ^ n U_i \textrm{ mod } 2, 反正可取值奇偶性一定
    尝试把不定数集构造成不存在 αi>jiαj\alpha_i > \sum_{j \neq i} \alpha_j 的情况, 如何构造?
    发现直接构造成 αv0=Lv0,αy=Uy\alpha_{v_0} = L_{v_0}, \alpha_y = U_y 即可, 如果出现了超过一半的 αi\alpha_i, 那么直接将其缩小到恰好一半即可
    因此可以达到最优解

另外一种理解方式
pEBhfun.png

总结一下
首先列出一般的 \(\mathcal{O} (n^2)\) 的可行性树形 \(\rm{dp}\)
发现状态可以简化, 于是考虑简化后状态 \(f_u\) 表示 \(u\) 子树中, 最少还剩下多少个点没有被匹配应该怎么转移
作为子问题处理
找到关键性质: 可以根据 \(\max f_{v \in \textrm{son}(u)}\) 对应的 \(v\)\(v_0\), 来进行转移
然后分类讨论具体处理, 就不难转移了

最终的方程是

\[ \begin{aligned} f_x= \begin{cases} f_{v_0}-(siz_x-1-siz_{v_0})+1 & f_{v_0} > (siz_x-1-siz_{v_0}) \\ (siz_x-1) \bmod 2 +1 & f_{v_0}\leq (siz_x-1-siz_{v_0}) \end{cases} \end{aligned} \]

答案是 \(\dfrac{n-f_{root}}{2}\), 复杂度 \(\mathcal{O} (n)\)

总结

可达性问题, 如果要优化可以考虑贪心性质, 是常见的最优解性质的一种
简化状态是动态规划转移的一个重要优化技巧, 但是要注意一般需要打出表来处理, 纯瞪眼的话需要小心验证

树上点对问题往往在 \(\rm{LCA}\) 上处理

注意集合中超过和一半的数最多只有一个

子问题的处理, 往往也是那一套

利用率是最大的问题, 而非效率
每时每刻保证自己在单段中处理问题
心态要好

posted @ 2025-03-25 09:32  Yorg  阅读(10)  评论(0)    收藏  举报