1. 程式人生 > 其它 >[CF321D]Ciel and Flipboard

[CF321D]Ciel and Flipboard

壹、題目描述 ¶

  傳送門 to CF.

貳、題解 ¶

  首先 \(m\overset\Delta=\frac{n+1}{2}\),有個最暴力的想法:列舉左上角 \(m\times m\) 的小正方形,然後計算正方形的價值。

  然而,有一個最基礎的性質 —— 無論我們如何操作,\((m,m)\) 的格子是一定會被操作的。

  這個特性似乎並沒有什麼卵用,但是它啟發了我們考察每一行、每一列中間的那個格子,與其他格子之間,操作會發生什麼事情。

  不妨先考察同一行,設該行為 \(r\),那麼,不難發現,如果我們的操作涵蓋了第 \(r\) 行,那麼 \((r,m)\) 是一定會被操作的。然而,存在一個更強的性質 —— 由於 \(m\)

剛好是 \(n\) 的一半多一個,所以,對於兩個對應的格子 \((r,c)(c<m)\)\((r,c+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(2^n)\) 級別,仍然不足以通過,不過,若我們已經枚舉了 \((m,1),(m,2),\cdots,(m,m)\),那麼我們實際上可以直接貪心地看第 \(r\) 行對應的中間點 \((r,m)\),看一看第 \(r\) 行與第 \(r+m\) 行應該如何取是最大的,而不用列舉。

  此時,複雜度就降至 \(\mathcal O(m^22^m)\),足以通過。

  不過並沒有程式碼。