• 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被打爆了.

  • 相关阅读:
    .NET技术对软件行业的积极作用
    ADO.NET Entityframework MYSQL provider
    用杯子量水问题通用解法
    详解.NET异步
    说 框架、架构、模式、重构
    谈 三层结构与MVC模式的区别
    面试题一例分享
    LINQ notes2 lambda expression
    毕业论文B.3 DTW算法
    LINQ notes1 intro
  • 原文地址:https://www.cnblogs.com/Heltion/p/13975432.html
Copyright © 2020-2023  润新知