ABC396G做题笔记
ABC396G 题目大意
有一个 \(n\times m\) 的 \(01\) 矩阵,可以进行任意多次操作,每次将某一行或某一列 \(01\) 翻转,问操作后矩阵中所有数的和最小是多少。
\(n\leq 18\)
\(m\leq 2\times 10^5\)
DP 做法
定义:\(B_i=\{x|a_{x, i}=1\}\)
显然的思路是枚举哪些行进行翻转,假设进行翻转的行的集合是 \(S\),那么答案显然是 \(\sum_{i=1}^m \min(|S\triangle B_i|, n-|S\triangle B_i|)\)。
考虑如何快速计算这个式子,\(\min\) 不好维护,于是可以枚举 \(k=|S\triangle B_i|\),把问题转化为求 \(\sum_{i=1}^m[|S\triangle B_i|=k]\)。
为了维护集合大小,考虑将集合中的元素逐步加入的方法。因此设 \(F_{S, i, k}\) 表示有多少个 \(id\) 满足只考虑前 \(i\) 个元素,\(|B_{id}\triangle S|=k\)
转移方法是将所有 \(B_j\) 分为 \(i\in B_j\) 和 \(i\notin B_j\) 两类,对于这两类分别计算。但是为了避免重复计算,必须对 \(B_id\) 中 \(\{i+1, i+2, ..., n\}\) 这些元素做出限定,所以应该这样设计转移方程:
\(F_{S, i, k, T}\) 表示有多少个 \(id\) 满足只考虑前 \(i\) 个元素,\(|B_{id}\triangle S|=k\) 并且 \(B_{id}\cap \{i+1, i+2, ..., n\}=T\)
转移是对于第一类:
- 如果 \(i\notin S\),由 \(F_{S, i-1, k-1, T\cup\{i\}}\) 转移而来。
- 如果 \(i\in S\),由 \(F_{S/\{i\}, i-1, k, T\cup\{i\}}\) 转移而来。
对于第二类: - 如果 \(i\notin S\),由 \(F_{S, i-1, k, T}\) 转移而来。
- 如果 \(i\in S\),由 \(F_{S/\{i\}, i-1, k-1, T}\) 转移而来。
这样看起来复杂度是平方级别的,但是注意到 \(S\subseteq\{1, 2, ..., i\}, T\subseteq\{i+1, i+2, ..., n\}\),所以 \(S\) 和 \(T\) 的总状态是 \(O(2^n)\),最终复杂度 \(O(n^2 2^n)\)。
集合幂级数做法
DP 还是太慢了,而且状态定义也比较复杂,远远不如集合幂级数优雅。
让我们推一波式子:
\(\sum_{i=1}^m \min(|S\triangle B_i|, n-|S\triangle B_i|)\)
=\(\sum_{T\subseteq U}\min(|T|, n-|T|) \sum_{i=1}^m [S\triangle B_i=T]\)
=\(\sum_{T\subseteq U}\min(|T|, n-|T|) \sum_{i=1}^m [T\triangle B_i=S]\)
=\(\sum_{T\subseteq U}\min(|T|, n-|T|) \sum_{A\subseteq U} (\sum_{i=1}^m [B_i=A])[T\triangle A=S]\)
=\([x^S]((\sum_{T\subseteq U}\min(|T|, n-|T|))\times(\sum_{A\subseteq U} (\sum_{i=1}^m [B_i=A])))\)(这里的乘法是异或卷积)
然后就做完了,复杂度 \(O(n2^n)\)。
简单讲一下推式子的思路:
这道题显然使用异或卷积做,但异或卷积维护的是形如 \([A\triangle B=S]f(A)g(B)\) 的形式而非 \(\min(|S\triangle B_i|, n-|S\triangle B_i|)\) 的形式。
所以我们要做的是把后者向前者的形式靠拢,自然的想法是枚举 \(T=S\triangle B_i\),这样 \(S\) 就能从 \(T\) 和 \(B_i\) 转移而来。
当时我在推式子的时候一直思考的是如何把 \(min\) 去掉,其实这些工作完全是没有用处的,因为没有把式子向异或卷积的方式靠近。因此必须先弄清楚希望把式子转变成什么样的形式,再有目的的推导。

浙公网安备 33010602011771号