CF1530G 題解

DE_aemmprty發表於2024-04-05

考慮對操作進行轉換。假設 \(a_i\) 為第 \(i\)\(1\) 前面的 \(0\) 的個數。

則操作可以進行如下轉換:

轉換 1:選擇一個長度為 \(k + 1\) 的子區間 \(a_{l ~ l + k}\)。我們先把 \(a_{l + 1 ~ l + k - 1}\) 翻轉,然後更改 \(a_l\)\(a_{l + k}\) 使得 \(a_l + a_{l + k}\) 不變。

轉換 2:操作是可逆的,所以若我們能把 \(S, T\) 都轉換成同一個字串 \(I\),那麼 \(S \rightarrow T\) 就是可行的。

於是現在的問題是能否把 \(S, T\) 轉換成同一個 \(I\)


現在我們想要把 \(a\) 陣列不為 \(0\) 的值儘量往前移,且我們有 \(2\times n\) 的操作次數。

容易發現,當我們翻轉了一個 \(a_{l ~ l + k}\) 時,我們可以讓 \(\begin{cases}a_l = a_l + a{l + k}\\a_{l + k} = 0\end{cases}\),這樣我們操作了 \(n - k\) 次後,只會有 \(a\) 的前 \(k + 2\) 個位置有值。


然後我們考慮如何把前 \(k + 2\) 個位置移到第 \(1\) 個位置。

若我們每次操作 \(a_{1 ~ k + 1}\)\(a_{2 ~ k + 2}\),則每次 \(a_{2 ~ k + 1}\) 會先進行長度為 \(2\) 的迴圈位移,然後把前兩個數設為 \(0\)

經過 \(\lfloor \frac{k}{2} \rfloor \times 2\) 次操作後,\(\forall 2 \leq i \leq k + 1, a_i = 0\)

然後,分類討論。


先考慮 \(2 \ |\ k\) 的情況。我們發現,奇數編號的位置不可能轉到偶數編號的位置,所以不可能。


再考慮 \(k\) 為奇數的情況。這時候,我們只要 \(a_{2, k + 2}\)\(a_{1, k + 1}\) 輪流操作即可。次數 \(k + 1\)

時間複雜度 \(\mathcal{O}(n ^ 2)\),操作次數最大為 \(n + k + 1\)。由於 \(k = n\) 時不可能存在解,所以滿足限制。


程式碼咕了。