一种很新的折半/根号分治。
手玩一下可以证明一个机器集合 \(S\) 的期望,先把 \(S\) 中 \(x=y\) 的机器对应的卡片翻好面,对于剩下的机器,如果一张卡片被至少一个机器覆盖过(即 \(x=i\) 或 \(y=i\)),那么它的期望是 \(\dfrac{a+b}{2}\),否则就是 \(a\)。
首先把 \(x_i=y_i\) 的机器处理掉,如果 \(a_{x_i}<b_{x_i}\),那就直接交换。然后就可以不管这些东西了。毕竟再翻只会使期望变小。
现在只考虑 \(x\not =y\) 的机器。
将 \(a_i\ge b_i\) 的卡片记为集合 \(P\),剩下的为 \(Q\)。覆盖一张卡的贡献是 \(\dfrac{b_i-a_i}{2}\)。
首先有一个观察:
-
覆盖 \(Q\) 中点优于覆盖 \(P\) 中点。
-
对于 \(x_i\in P,y_i\in P\),这个机器永远不用。
-
对于 \(x_i\in Q,y_i\in Q\),这个机器必然使用。(这里官方题解好像写错了)
下面将 \(x\in Q,y\in P\) 的机器交换 \(x,y\),变为 \(x\in P,y\in Q\)。
接下来介绍两种做法:
\(1.\)
暴力枚举 \(P\) 中被覆盖的点的集合 \(S\),因为覆盖 \(Q\) 中的点优于覆盖 \(P\) 中的点,所以所有 \(x\in S,y\in Q\) 的机器必选。
复杂度 \(O(m+2^{|P|}n)\)。
\(2.\)
进行 \(dp\),记 \(dp[i][j]\) 为处理完 \(P\) 中前 \(i\) 个点,当前 \(Q\) 中选的集合为 \(j\) 时,\(P\) 中已选的点的最大值。
同上,可以预处理 \(P\) 中每个点作为机器的 \(x\) 时对应的 \(y\) 的集合,只要选了这个点,必然覆盖所有的 \(y\)。
然后 \(dp\) 完以后加上 \(j\) 中点的贡献就行了。
复杂度 \(O(m+2^{|Q|}n)\)。
我们发现 \(|P|+|Q|=n\),因此 \(\min(|P|,|Q|)\le \dfrac{n}{2}\),根据两个集合的大小选择做法就可以了。
标签:ABC313F,机器,卡片,覆盖,dfrac,Flip,dp,集合,Machines From: https://www.cnblogs.com/jimmywang/p/17610869.html