CF1733E Conveyor

cxqghzj發表於2024-08-29

題意

給定一個 \(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)\)