CF2219C Coloring a Red Black Tree 题解
非常好题目。
注意到,你目前的最优策略只和当前的红点集合有关。而操作失败并不会改变红点集合。因此你的最优操作肯定是对着一个点一直操作直到成功为止。相当于我们要给所有点排出来一个顺序。
记作
这个点对期望做出的贡献就是
我们希望最小化
下文的所有
DP ver.
不妨转化成给树上的边定向,按照拓扑序输出方案。实际上的
考虑任意指定一个根节点,令
转移的时候可以考虑子树所有边都是指向自己的。从指向自己切换到指向儿子会产生
假设从儿子中选择了
对于
对指向自己和指向父亲的情况做两次转移。需要注意对于
此时不建议直接使用浮点计算得到的 inf,可能带来问题。应当直接跳过或者设置为一个极大值(比如 1e100)。
贪心 Ver.
直觉上,度数越多的节点应该往后放,等周围红色节点比较多时再染色。但是如果这个点一开始就有很多的红色节点,有可能立刻染就是最优的。
这启示我们建立一个偏序关系,并且按照这个顺序染色。对于“排序一个序列使得代价最小”的问题通常可以考虑这个,这就是被临项交换称作临项交换的技巧。
考虑交换相邻两个点
做差简单推一下式子就会发现
然而,
我们继续考虑边定向的思路。实际上有很多顺序是本质相同的,对应到边定向上都是一样的。考虑我们的交换实际上意味着什么。
实际上,我们就是反转了一条边的方向。
进一步观察可以发现,不止是反转一条边的方向,如果反转一整条链的方向,造成的影响也是让链尾
我们考虑另外一种策略:每次在没有染色的节点中,选择
我们将证明这样的操作是最优的。下面的证明来自跃迁(QQ:756507076)。
实际上我们只需要证明这个点一定在最优序列的第一个即可。
假设这个点不是第一个,那么其在最终定向之后的图中必然存在来自当前某个黑点的入度,假设当前这个点的入度是
根据上面发现的结论,我们只需要比较
而
也就是
此时取反这条链不劣。
证毕。
值得一提的是,这个证明并不能推广到图上面,因为该证明不能保证链取反之后是个 DAG(不存在环)。
考虑反转
因此取反后的图可能没有合法方案。而树这个结构本身就没有环,因此无论如何都存在一组合法方案。