[update] hihoCoder Challenge 18题解

1
2

关于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)的和。稍微观察一下就能发现该式子恰好计算了答案。 可以使用高斯消元来简单地计算这些值。

11 answer(s)

0

一分钟之内被三个老司机瞬间超过是怎样一种体验

0

突然就感觉自己有主角光环了..

1

窝的程序比标算优啊。。不服

0

D的E(a,b)怎么算

0

B题,后面的所有乘操作的期望。这个怎么算啊?

0

C题给个数据: 5 3 2 2 0 1 1 1 2 2 3 3 4 4 5 嘿嘿嘿!

0

C题std对么?。。。

0

太久没算题了……感觉脑子都生锈了……

0

C题标算不对?考虑一条链2T-0-T-T

0

前排啊

0

sf

write answer 切换为英文 切换为中文


转发分享