【题解】ABC388F Dangerous Sugoroku

AT_abc388_f 题解

本题解主要侧重于证明(当然有些并不是很严谨),如果您想知道做法可以参考其它题解。

先将不合法段转成合法段。

设从前到后第 \(i\) 个合法段为 \([l_i,r_i]\)。根据题意以及合法段的定义,可以证明合法段互不相交。

考虑每一个合法段。我们先从下列命题入手。

命题 I 从第 \(1\)\(x-1\) 个合法段跳到第 \(x\) 个合法段,第一次跳到的位置必然在第 \(x\) 个合法段的前 \(b\) 个位置上。

\(X=R_{x-1}\)\(Y=L_x\)\(Z=R_x\)

该命题等价于:设有 \(1\le u \le X\),若 \(k\) 是满足 \(Y \le u+bk \le Z\) 最小的 \(k\),则 \(Y \le u+bk \le Y+b-1\)

反证法,假设 \(Z \ge u+bk \ge Y+b\)

则显然 \(Z - b \ge u + b(k-1) \ge Y\), 即 \(Z \ge u + b(k-1) \ge Y\)

于是,对于所有的 \(u+bk\),都可以找到一个比他小的 \(k\) 满足 \(Y \le u+bk \le Z\),这与 \(k\) 的定义矛盾,于是原命题成立。

命题 II 对于长度大于 \(ab+b\) 的合法段,若它的前 \(b\) 位中有一位可以被跳到,则它的后 \(b\) 位均可以被跳到。

该命题等价于:设有 \(1 \le u \le b\) 以及 \(m > ab+b\),则对于所有 \(m-b+1 \le s \le m\)\(u + ax_1 + (a+1)x_2+(a+2)x_3+\ldots+bx_{b-a+1} = s\) 均成立。

命题等价于 \(ax_1 + (a+1)x_2+(a+2)x_3+\ldots+bx_{b-a+1} = s - u\) 均成立。

考虑这些数最大的不能表示的数 \(M\) 是什么。这里给出一个感性的上限:\(ab\)。原因可以参考这篇文章,其中给出了三个数的上限,代入我们的数据可以知道 \(M \le ab-a-b-c \le ab\)。实际上我们发现,随着数的个数的增加,\(M\) 会越来越小,因此 \(ab\) 这个上线足够我们得到正确的解。

所以 \(s-u > ab\),也就是说 \(s > ab + u > ab+b\)。所以 \(m \ge s > ab+b\)

在实际实现代码的过程中,我们不一定要取 \(ab+b\) 这样的上限,而是可以直接开到一个较大的合适的值,使之恒大于 \(ab+b\),比如说 \(20\times 20+20+30=450\)

不妨设这个上限是 \(G\)

命题 III 对于跳到下一个合法段,只需要知道的每一段的后 \(b\) 位是否能跳到。

这个命题是显然的。假设一块的右端点是 \(x\),则 \(x-b\) 最多只能跳到 \(x\),无法跳到下一个。所以只能是 \(x - b + 1\)\(x\) 这段跳。

命题 IV 若从某一段的后 \(b\) 位逐位跳 \(a\)\(b\) 格,那么只需要递增地跳。

“递增地跳”的意思是,如果某一跳跳到的位置比前面一跳跳到的位置要前,那么这一跳就不跳了。

命题依旧平凡,显然不会出现因为递增地跳就漏跳的的情况,因为你是逐次跳的。


再次考虑命题 II 的成立条件,发现当 \(a = b\) 时该命题不成立。于是特判即可。

综合上述命题,我们考虑动态规划。设第 \(i\) 段的第 \(j\) 个位置是否能跳到为 \(f_{i,j}\)

则:

  • \(f_{i,j}=\lor_{u=a}^b f_{i,j-u}\)
  • \(f_{i,j+k}=f_{i,j+k}\lor f_{i,j}\)\(a\le k \le b\)

根据命题 II,可以知道如果第 \(i\) 段的长度大于 \(G\),那么只需记录是否有位置跳到过这里即可,即数组 \(f_i\) 只需开一个空间。否则,开对应区间长度个空间即可。

根据命题 III 和命题 IV,可以知道我们只需要遍历每一段的后 \(b\) 位,并逐位跳 \(a\)\(b\) 格,递增地跳然后更新即可。

posted @ 2025-01-13 23:11  邻补角-SSA  阅读(27)  评论(0)    收藏  举报  来源