加载中...

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\) 染红色概率)。

对于某个黑色连通块,一定存在某个最优的染色操作顺序,使得期望总操作次数最小。考虑如何找到这个最优的操作顺序。

若直接按照当前每个结点染色操作数的期望从小到大贪心,显然是没有太多道理的。我们不妨从局部贪心的角度出发,考虑每两个操作顺序相邻(即先操作一个,紧接着操作另一个)的黑色结点,比较它们交换染色顺序前后的期望操作次数有什么样的改变。分两种情况考虑:

  1. 两个结点不互为邻结点:显然先操作哪个结点对另一个结点的操作期望数是没有影响的。
  2. 两个结点互为邻结点:设为 \(u, v\)。则先操作 \(u\),会导致操作 \(v\) 时邻结点中红色结点数量多 \(1\)。具体地,先 \(u\)\(v\) 的期望总操作次数为:

\[\frac{deg_{u}}{cnt_{u}} + \frac{deg_{v}}{cnt_{v}+1} \]

同理,先 \(v\)\(u\) 的期望总操作次数为:

\[\frac{deg_{v}}{cnt_{v}} + \frac{deg_{u}}{cnt_{u}+1} \]

显然,对于两种操作顺序,贪心地选择期望总操作次数较小的会更优。假设先 \(u\)\(v\) 更优,则有:

\[\frac{deg_{u}}{cnt_{u}} + \frac{deg_{v}}{cnt_{v}+1} \le \frac{deg_{v}}{cnt_{v}} + \frac{deg_{u}}{cnt_{u}+1} \]

化简得到:

\[\frac{deg_{u}}{cnt_{u}(cnt_{u}+1)} \le \frac{deg_{v}}{cnt_{v}(cnt_{v}+1)} \]

因此我们有结论:对于同一黑色连通块内的所有黑色结点,按照 \(\frac{deg_{i}}{cnt_{i}(cnt_{i}+1)}\) 大小升序依次操作所有结点是最优的(注意在操作过程中 \(cnt\) 会变,需要动态维护最小值而不是直接按照预先排序的顺序去操作)。用 set 维护上述贪心即可。

实际上,我们不需要对每个黑色连通块分别单独做一次贪心,可以把它们整合到一起来做,因为对于属于不同黑色连通块的两个黑色结点,二者一定是不相邻的。因此把所有连通块的 set 整合放到一个 set 中,与分别去做是等价的。

code

posted @ 2026-04-16 19:02  小橘奏  阅读(30)  评论(2)    收藏  举报