CF1733E Conveyor
题意
给定一个 \(120\) 行 \(120\) 列的棋盘。
一开始 \((0, 0)\) 有一个史莱姆,每个地方有一个箭头,最初全部指右。
每一秒做一下过程:
-
每一个史莱姆朝所在箭头方向移动一格,如果在棋盘之外,则移除该史莱姆,如果两个史莱姆走到了一个格子之上,合并为一个史莱姆。
-
所有史莱姆前一秒所在的格子的箭头方向改变,向右改为向下,向下改为向右。
-
在 \((0, 0)\) 新增一个史莱姆。
\(q\) 次询问,每次询问 \(t\) 时刻点 \((x, y)\) 是否有史莱姆。
Sol
注意到无论如何都不会出现合并史莱姆的情况,因为若当前 \((x, y)\) 有一个史莱姆,那么该史莱姆一定是在 \(t - (x + y + 1)\) 时出现的。
对于每一个位置考虑,注意到所有经过当前格子的史莱姆为 \(S\),那么一定有 \(\lceil \frac{S}{2} \rceil\) 个史莱姆去了右边的格子,剩下 \(\lfloor \frac{S}{2} \rfloor\) 个史莱姆一定去了下面的格子。
那么现在的思路就很显然了,考虑设 \(f_{i, j}\) 表示点 \((i, j)\) 经过了的史莱姆个数。
事实上,我们只是对于每个点的史莱姆个数做了一个前缀和,因此判断 \(t\) 时刻是否有新增史莱姆,直接判断 \(f_{t, i, j}\) 和 \(f_{t - 1, i, j}\) 是否相同即可。
这样还有一个问题,我们如何知道当前哪些史莱姆应该停止不移动下去。
这个问题很显然,我们只需要保证当前询问的 \((x, y)\) 点正确即可,因此只需要考虑走的步数 \(\ge x + y - 1\) 的史莱姆即可。
复杂度:\(O(120 ^ 2 q)\)。