关于C题错误的说明
C题确实是出题人的算法有问题。去掉C题的得分后,排名是apiadu第一,jiry_2第二,C_SUNSHINE第三。我们决定给apiadu补发一个第一名奖品BB-8,同时把原本的第三名奖品《The C++ Programming Language》发给第四名Newnode。即最后是jiry_2 一等奖,C_SUNSHINE 二等奖, apiadu 一等奖,Newnode 三等奖。
A
我们可以先枚举所有与B的编辑距离为1的字符串,然后再计算交换A中相邻两个需要多少次才能变成B。 注意到我们不会交换A中相邻的两个一样的字符,所以相同的字符之间的相对顺序是不变的。 因此我们就能知道每个A中字符最后所在的位置,那么这就变成了一个经典的问题,求逆序对数量即可。
B
首先注意其实这就是求期望,然后期望具有线性性,我们可以求每个位置最后的期望和。 考虑一些+和*的操作序列,注意到每个+x,如果它后面所有的乘操作的积是y,那么它就会对答案贡献xy。 这样的话,我们可以来计算每个加操作,后面的所有乘操作的期望是多少。再进行简单的计算即可。
C
注意到包含最大权点的那个连通分量自然是越大越好。容易看出最优解一定是最大权点的那个联通分量包含了n-k+1个点。
其它的所有点各自组成一个分量。那么问题就变成了求包含最大权点的那个连通分量的最大权和是多少。这是一个经典的树形dp问题。
D
对每两条不同的边a,b, 计算E(a,b)表示a和b都选了的合法子图有几个。 对每条边a,计算E(a)表示选了a的合法子图有几个。 容易看出答案是所有E(a,b)的和乘2加上所有E(a)的和。稍微观察一下就能发现该式子恰好计算了答案。 可以使用高斯消元来简单地计算这些值。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%