CF1977D XORificator

lupengheyyds發表於2024-11-09

CF1977D XORificator

題意

給你一個二進位制(僅由 \(0\)\(1\) 組成)\(n \times m\) 矩陣。你可以進行以下操作任意次:反轉某一行中的所有值(即用 \(1\) 替換 \(0\),用 \(0\) 替換 \(1\))。

矩陣中的某一列如果只包含一個 \(1\),則被視為特殊列。你的任務是找出最多有多少列可以同時被特殊化,以及為達到這一目的應在哪幾行反轉。

\(1\le nm\le 3\times 10^5\)

題解

我們發現,如果我們欽定第 \(j\) 列的第 \(i\) 行位置為 \(1\),其他行位置為 \(0\)。會發現其實我們確定了整個矩陣。它的反轉方式也是唯一確定的。

於是可以考慮列舉每一列,得到欽定某一個位置為 \(1\) 時哪些行需要反轉。

在最多列出現的反轉方案就是答案。於是我們可以將一種反轉方案雜湊起來,放入 map 進行統計,這裡我用的隨機權值異或的雜湊方法。

接著考慮如何 \(\mathcal O(1)\) 求出反轉方案的雜湊值。

可以統計前字尾的雜湊值,為 \(1\) 視作反轉,為 \(0\) 視作不反轉,一個位置為 \(1\) 的反轉方案應該為前字尾的反轉方案加上這一位的相反狀態。

於是我們就可以 \(\mathcal O(nm)\) 的解決掉這道題。

總結

  • 找供需關係

    看答案的貢獻並找到使得這個貢獻進入答案的要求

相關文章