AtCoder Beginner Contest 196 A-F题解

AC代码

A - Difference Max

输出\(b - c\)

B - Round Down

遍历字符串,若遇到.将其改为\0

C - Doubled

易得:前半部分的值不会超过\(10^6\)

所以可以枚举前半部分的值,再判断是否满足条件。

D - Hanjo

因为\(HW \le 16\),比较小,所以直接递归暴力求解。

复杂度分析

如果面积为2的方块都确定了,那么面积为1的方块的放置方式也就确定了。

若不考虑面积为2的方块重叠的case,那么可以从\(HW\)个各自中选择\(A\)个作为方块的左上角,一共\(C_{HW}^{A}\)种方法,再加上每个方块有两种可能的朝向,一共\(2^A\)中方法。合并在一起一共\(2^AC_{HW}^{A}\)种放置方法。

若考虑方块重叠,放置方法会更少。

由此,复杂度至多为\(O(2^AC_{HW}^{A})\),在这题的数据量上已经足够了。

E - Filters

首先,每种操作都可以按下列方式转化成\(f(x) = min(c, max(b, x + a))\)的形式。

  • \(t_i = 1: f(x) = x + a_i = \min(\infin, \max(-\infin, x + a_i))\)
  • \(t_i = 2: f(x) = max(a_i, x) = \min(\infin, \max(a_i, x + 0))\)
  • \(t_i = 3: f(x) = min(a_i, x) = \min(a_i, \max(-\infin, x + 0))\)

其次,可以推导出:若\(f,g\)都为具备上述形式的函数,那么\(g(f(x))\)也为满足上述形式的函数。

由此,\(f_N( \dots f_2(f_1(x_i)) \dots )\)也为满足上述形式的函数,每次按\(t_i\)的不同更新参数\(a, b, c\)即可,每次更新的时间复杂度为\(O(1)\)。具体如下:

  • \(f_1(x) = \min(c_1, \max(b_1, x + a_1))\)
  • \(f_2(x) = \min(c_2, \max(b_2, x + a_2))\)
  • \(f_2(f_1(x)) = \min(\min(c_2, \max(b_2, c_1 + a_2)), \max(\max(b_2, \min(c_1 + a_2, b_1 + a_2)), x + (a_1 + a_2)))\)

现在,\(f_N( \dots f_2(f_1(x_i)) \dots ) = min(c, max(b, x + a))\)然后就可以\(O(1)\)回答每一个询问,总的复杂度是\(O(N + Q)\)

F - Substring 2

\(S_i = T_j\),则两者匹配的代价为0,反之为1。其实就是异或操作。

\(T\)最后成了\(S\)从下标\(i\)开始的字串,则需要的操作次数

\[\begin{align} cost_i &= \sum_{j = 0}^{|T| - 1} S_{i + j} \oplus T_j \\ &= \sum_{j = 0}^{|T| - 1} (1 - S_{i + j})T_j + \sum_{j = 0}^{|T| - 1} S_{i + j}(1 - T_j) \\ &= \sum_{j = 0}^{|T| - 1} S_{i + j} + \sum_{j = 0}^{|T| - 1} T_j - 2\sum_{j = 0}^{|T| - 1} S_{i + j}T_j \end{align} \]

式子的前两项都比较容易计算,而第3项长得很像卷积的式子,也确实可以通过简单的换元变成卷积。

\(R^\prime = reverse(T)\),则有

\[\begin{align} C_i &= \sum_{j = 0}^{|T| - 1} S_{i + j}T_j \\ &= \sum_{j = 0}^{|T| - 1} S_{i + j}R_{|T| - 1 - j} \\ &= \sum_{x + y = i + |T| - 1} S_xR_y \end{align} \]

\(C_i\)可以用FFT在\(O(n \log_n)\)的时间内计算。特别地,\(C_{i - |T| + 1}\)\(cost_i\)的第3项值。

计算出所有的\(cost_i\)取最小即可。

posted @ 2021-03-25 22:30  _Backl1ght  阅读(155)  评论(0编辑  收藏  举报