cf div2 1093 E(巧妙排序贪心)
C. Coloring a Red Black Tree
Q:给定一棵树,每个结点要么是红色,要么是黑色。每次操作可以选择任意一个结点,将该结点的颜色随机染成它的所有邻居结点的某种颜色,目标是让所有结点均染成红色,求最小操作次数的期望。
显然每次操作只会选择黑色结点,并且对于不同的黑色连通块,它们的操作是相互独立的,不会因操作次序的不同而彼此产生影响,故我们只需要对某个单独的黑色连通块考虑操作次数的期望,最后累加求和即可。
对于某个结点 \(u\),其邻居结点的数量为 \(deg_{u}\),并设其邻居结点中红色结点的数量为 \(cnt_{u}\)。那么一次操作将该结点染成红色的概率即为 \(\frac{cnt_{u}}{deg_{u}}\);根据期望的定义,将该节点染成红色的期望操作次数为:\(\frac{deg_{u}}{cnt_{u}}\)(期望染色次数 = 实际染色次数 \(\times\) 染红色概率)。
对于某个黑色连通块,一定存在某个最优的染色操作顺序,使得期望总操作次数最小。考虑如何找到这个最优的操作顺序。
若直接按照当前每个结点染色操作数的期望从小到大贪心,显然是没有太多道理的。我们不妨从局部贪心的角度出发,考虑每两个操作顺序相邻(即先操作一个,紧接着操作另一个)的黑色结点,比较它们交换染色顺序前后的期望操作次数有什么样的改变。分两种情况考虑:
- 两个结点不互为邻结点:显然先操作哪个结点对另一个结点的操作期望数是没有影响的。
- 两个结点互为邻结点:设为 \(u, v\)。则先操作 \(u\),会导致操作 \(v\) 时邻结点中红色结点数量多 \(1\)。具体地,先 \(u\) 后 \(v\) 的期望总操作次数为:
同理,先 \(v\) 后 \(u\) 的期望总操作次数为:
显然,对于两种操作顺序,贪心地选择期望总操作次数较小的会更优。假设先 \(u\) 后 \(v\) 更优,则有:
化简得到:
因此我们有结论:对于同一黑色连通块内的所有黑色结点,按照 \(\frac{deg_{i}}{cnt_{i}(cnt_{i}+1)}\) 大小升序依次操作所有结点是最优的(注意在操作过程中 \(cnt\) 会变,需要动态维护最小值而不是直接按照预先排序的顺序去操作)。用 set 维护上述贪心即可。
实际上,我们不需要对每个黑色连通块分别单独做一次贪心,可以把它们整合到一起来做,因为对于属于不同黑色连通块的两个黑色结点,二者一定是不相邻的。因此把所有连通块的 set 整合放到一个 set 中,与分别去做是等价的。

浙公网安备 33010602011771号