https://atcoder.jp/contests/abc313
F - Flip Machines
n张卡,正面ai,背面bi,初始都是正面
m个机器,对应卡xj,yj,!!xj可能等于yj
如果一个机器启动 则1/2几率 翻转卡xj,否则翻转卡yj
启动机器的集合任意选择
问 所有的 启动机器的集合 的方案中 卡的和
的期望值最大是多少
n 40
ai,bi [1,1e4]
m 1e5
2s
1024mb
我的思路
显然是个概率论的题
n 比较小,m中等,ai,bi中等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 卡 a1 a2 a3
m组 [1,2] [1,3]
第一次翻转 b1 a2 a3 a1 b2 a3
第二次翻转 a1 a2 a3 b1 a2 b3 b1 b2 a3 a1 b2 b3
|
从频次的角度来看, 如果涉及到翻转,那么该位置的期望贡献就是 (a[i]+b[i])/2
如果不涉及翻转 那么期望贡献就是 a[i]
所以选取的集合 就算再多,也只和被激活的那些有关,和一个位置被选了几次无关
所以问题可以变为,基础 = sum ai,
di = (b[i]-a[i])/2
有一堆激活的pair可以任意选,
问 最大 di和为多少
把di 按照正(>=0),负(<0)分类
如果有 (+,+)的di pair则一定选, 如果有(-,-)一定不选
那么剩下的就是 (+,-)的
而这类如果 其中的+已经选了 则一定不选
所以变成了, 未被选的+,所有-
和很多(+,-)的问题
那么显然 至少一侧的个数 <= n/2 = 20
这就很像bitset了
如果 所有-的个数 <= n/2 那最简单, 就是贪心选掉所有(+,-)有-被选的正的里面的
如果 所有+的个数 <= n/2???
1 2 3 4
| (a0 10,b0 -5) (a1 10,b0 -5) (a0 10,b1 -4) 对于 单个来说最小, 但是 上面都选b0 比 选两个b1,b2更优 (a1 10,b2 -4)
|
只能说 最终被选的 -的个数肯定 <= n/2, 因为每个(+,-) 最多选一次
n-正 个中 选 <=正的方案数? 这有多大?
正=20时 2^20
正=19时 $2^{21}-\binom{21}{21}-\binom{21}{20}$
正=18时 $2^{22}-\binom{22}{22}-\binom{22}{21}-\binom{22}{20}-\binom{22}{19}$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def binom(n,m): s = 1 for i in range(1,m+1): s *= (n+1-i) s //= i return s
def f(pos): neg = 40 - pos r = 2**neg for i in range(pos+1,neg+1): r -= binom(neg,i) print(pos, r)
for i in range(1,21): f(i)
|
看输出 感觉 还是2s过不了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 1 40 2 742 3 8474 4 66712 5 384168 6 1676116 7 5663890 8 15033173 9 31621024 10 53009102 11 71116846 12 76717268 13 67108864 14 48412432 15 29703676 16 16241061 17 8344056 18 4192510 19 2097130 20 1048576
|