[CF 1914F] Programming Competition
前言
还是感觉到了一些不对啊, 自己推导的能力需要加强
思路
题意很清楚
题意
给定一个 个点的树, 每个点父亲
求最多可以找到多少二元对 , 使得每个点都仅属于至多一个二元对, 且 互相不为祖先
猜测是树形 \(\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}\), 应该怎么做?
为了方便理解, 下面具体分析这个子问题
子问题
问题: 给定大小为 的不定数集 , 定义一次匹配为 , 其中 , 求多次匹配操作之后, 最小化 中的和
其中 奇偶性相同
要求复杂度达到
问题显然是困难的, 因为同时涉及到了不定数集的取值, 以及匹配问题的最优解构造.
一个显而易见的部分是
不难发现这种情况下显然用 去匹配其他的 是最优的.
补充一下, 你会发现 至多存在一个
剩下
这种情况下如何处理?
猜测想办法最终只留下
不难发现最优答案应当为 , 反正可取值奇偶性一定
尝试把不定数集构造成不存在 的情况, 如何构造?
发现直接构造成 即可, 如果出现了超过一半的 , 那么直接将其缩小到恰好一半即可
因此可以达到最优解
总结一下
首先列出一般的 \(\mathcal{O} (n^2)\) 的可行性树形 \(\rm{dp}\)
发现状态可以简化, 于是考虑简化后状态 \(f_u\) 表示 \(u\) 子树中, 最少还剩下多少个点没有被匹配应该怎么转移
作为子问题处理
找到关键性质: 可以根据 \(\max f_{v \in \textrm{son}(u)}\) 对应的 \(v\) 为 \(v_0\), 来进行转移
然后分类讨论具体处理, 就不难转移了
最终的方程是
答案是 \(\dfrac{n-f_{root}}{2}\), 复杂度 \(\mathcal{O} (n)\)
总结
可达性问题, 如果要优化可以考虑贪心性质, 是常见的最优解性质的一种
简化状态是动态规划转移的一个重要优化技巧, 但是要注意一般需要打出表来处理, 纯瞪眼的话需要小心验证
树上点对问题往往在 \(\rm{LCA}\) 上处理
注意集合中超过和一半的数最多只有一个
子问题的处理, 往往也是那一套
利用率是最大的问题, 而非效率
每时每刻保证自己在单段中处理问题
心态要好


浙公网安备 33010602011771号