AtCoder Grand Contest 49

题解:
A. 非常有趣的一道题?考虑删除次数(=sum_{v}v)被选择的次数.
(v)被选择的概率是在(v)删除(v)之前可以到(v)的点都不会被删除,这个概率是(1/)可以到(v)的点.
B. 考虑到操作本质上是(01)变成(10)以及(11)变成(00),也就是(S)中每个(1)可以往左移动,以及消去相邻两个(1).
从左到右考虑(S)(T)所有(1)的位置,(S)中第一个(1)如果在(T)中第一个(1)左边,那么(S)这个(1)必须要和(S)中下一个(1)消去.否则则将这个(1)移动到(T)的第一个(1).类似地考虑后面的(1).
C. 考虑到(A_ile B_i)是可能破坏(0)位置,但如果存在满足(A_j>B_j)(A_j>A_ige A_j-B_j)(j),则(A_i)可以被(A_j)破坏掉.
因此可以线性找到所有需要修改的位置,即(A_ile B_i)且不存在上述的(j).
从大到小考虑每个需要被修改的位置,首先(A_i+1)的位置已经是合法的,如果(A_i+1)(0),那么增加一个即可破坏(A_i);否则肯定有一个(A_j)可以破坏(A_i+1),只需要再增加一个这种(A_j).
另一种可能的操作是将某个(A_ile B_i)的位置将(B_i)修改成(A_i-1),这样就不需要再考虑比它小的位置.注意到前一种修改的数量可以抵消这种修改的数量.
D. 记(dp[i][j])为长度为(i+1),第一个数是(0),和为(j)的方案数.
那么实际上是方程(i(i+1)/2x_1+(i-1)i/2x_2+cdots+x_1=j)的解.可以用完全背包计算.
注意到((i+1)i/2ge M)的所有(i)它的(dp)数组都是一样的,因此只需要算(sqrt M)(dp)值.
考虑枚举原数组最右边的最小值在哪,可以(O(M))计算,但是中间连续的一段算出来的答案实际上是相等的,实际上只需要计算前后共(2sqrt M)位置的方案.总的复杂度是(O(sqrt MM)).

总结:
不会算期望没做出A被打爆了.

原文地址:https://www.cnblogs.com/Heltion/p/13975432.html