AtCoder Beginner Contest 196 A-F题解
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\)开始的字串,则需要的操作次数
式子的前两项都比较容易计算,而第3项长得很像卷积的式子,也确实可以通过简单的换元变成卷积。
若\(R^\prime = reverse(T)\),则有
\(C_i\)可以用FFT在\(O(n \log_n)\)的时间内计算。特别地,\(C_{i - |T| + 1}\)是\(cost_i\)的第3项值。
计算出所有的\(cost_i\)取最小即可。