1 条题解
-
0
题解
思路
把一列从上到下的二进制数看成一个 位掩码 ,记相同掩码的列数为 。假设被翻转的行集合为掩码 ,那么该列变为 。
行操作确定后,每一列是否翻转可以独立决定。若当前列有 个 ,不翻转的代价是 ,翻转的代价是 ,故该列的最优贡献为
$$w(x)=\min(\operatorname{popcount}(x),n-\operatorname{popcount}(x)).$$于是选择行掩码 后的答案为
这正是两个长度为 的数组的异或卷积。用 Walsh--Hadamard 变换即可一次求出全部 。
做法
子任务 1:枚举行、列翻转集合
枚举 个行集合和 个列集合,直接统计翻转后的 。复杂度为 。
子任务 2:枚举行集合,贪心选择每一列
只枚举 个行翻转集合。对每个集合扫描全部列,并把每列贡献取为 。复杂度为 。
子任务 3:异或卷积
统计 ,构造 。分别对两个数组做异或 FWT,逐点相乘,再做逆变换,得到所有 ,取最小值。复杂度为 。
正确性证明
引理 1
固定行翻转集合 后,掩码为 的列对答案的最小贡献是 。
证明。 行翻转后该列的 的数量为 $k=\operatorname{popcount}(x\mathbin{\mathrm{xor}}s)$。列不翻转贡献 ,列翻转贡献 ;两者取小即得结论。
引理 2
异或卷积得到的第 项等于固定行翻转集合 时的最优答案。
证明。 异或卷积第 项为 。由引理 1,式中每项恰是对应各列独立选择是否翻转后的最小贡献,求和即得固定 的最优答案。
定理
算法输出所有合法操作序列中最少的 的数量。
证明。 任意操作序列都唯一对应一个行翻转集合,以及在该集合确定后对各列的翻转选择。引理 2 给出每个行集合下最优的列选择;枚举卷积的全部位置并取最小值,因而覆盖所有操作方案并取得全局最优值。
复杂度
时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1477
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者