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)\)

posted @ 2024-08-29 09:54  cxqghzj  阅读(4)  评论(0编辑  收藏  举报