[CF321D]Ciel and Flipboard
阿新 • • 發佈:2021-10-21
壹、題目描述 ¶
貳、題解 ¶
首先 \(m\overset\Delta=\frac{n+1}{2}\),有個最暴力的想法:列舉左上角 \(m\times m\) 的小正方形,然後計算正方形的價值。
然而,有一個最基礎的性質 —— 無論我們如何操作,\((m,m)\) 的格子是一定會被操作的。
這個特性似乎並沒有什麼卵用,但是它啟發了我們考察每一行、每一列中間的那個格子,與其他格子之間,操作會發生什麼事情。
不妨先考察同一行,設該行為 \(r\),那麼,不難發現,如果我們的操作涵蓋了第 \(r\) 行,那麼 \((r,m)\) 是一定會被操作的。然而,存在一個更強的性質 —— 由於 \(m\)
若記 \(f(i,j)\) 表示最終該格子是否被翻轉,那麼
\[f(r,c)\oplus f(r,m)\oplus f(r,c+m)=0 \]於是,我們可以只需要列舉中間的一行一列,就可以根據對應的四個格子 \((r,c),(r+m,c),(r,c+m),(r+m,c+m)\) 如何取,貪心地選擇最大值。
不過,這樣的複雜度為 \(\mathcal O(2^{2n})\),如果你注意到,我們實際上只需要列舉中間一行一列的前 \(m\)
此時,複雜度就降至 \(\mathcal O(m^22^m)\),足以通過。
不過並沒有程式碼。