「CF662C」 Binary Table

题目链接

题目所给的 \(n\) 很小,于是我们可以考虑这样一种朴素做法:暴力枚举第 \(i\) 行是否翻转,这样每一行的状态就确定了,这时取每一列 \(0/1\) 个数较小的数字即可(因为每一列也可以翻转)。这样的时间复杂度是 \(O(m\cdot2^n)\)。

但是显然这样过不了。

我们发现表格的具体行列对我们的答案是没有影响的。即我们只需要知道状态为 \(x\) 的行或者状态为 \(x\) 的列的个数即可。由于 \(n\le20\),这启发我们对于每一列进行状态压缩。

于是我们定义:\(f_S\) 表示列状态为 \(S\) 的列的个数,同时定义 \(g_S\) 为 列状态为 \(S\) 的列中 \(0/1\) 个数中小的一个。显然 \(f,g\) 两个数组都可以在可以接受的时间范围内预处理出来。

对于翻转情况,我们用一个数 \(x\) 表示,若二进制下第 \(i\) 位为 \(1\), 则代表第 \(i\) 行翻转。

于是有当翻转状态为 \(x\) 时,有

\[Ans_x=\sum_{i=0}^{2^n-1}f_ig_{i\oplus x}
\]

其中 \(\oplus\) 代表按位异或。

简单变形,我们可以得到

\[Ans_x=\sum_{i=0}^{2^n-1}\sum_{j=0}^{2^n-1}[i\oplus x=j]f_ig_j
\]

由于异或具有交换律,于是有

\[Ans_x=\sum_{i=0}^{2^n-1}\sum_{j=0}^{2^n-1}[i\oplus j=x]f_ig_j
\]

这就是集合幂卷积中异或卷积的标准形式,直接使用 \(\texttt{FWT}\) 优化计算即可。时间复杂度为 \(O(n2^n)\)。

代码很简洁,如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;
long long num[maxn],f[maxn],g[maxn];
int n,m;
inline void XOR(long long *f,int tmp){
for(int o=2,k=1;o<=n;o<<=1,k<<=1){
for(int i=0;i<n;i+=o){
for(int j=0;j<k;++j){
long long a=f[i+j],b=f[i+j+k];
if(tmp) f[i+j]=a+b,f[i+j+k]=a-b;
else f[i+j]=(a+b)>>1,f[i+j+k]=(a-b)>>1;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int x;scanf("%1d",&x);
num[j]+=x*(1<<i-1);
}
}
for(int i=1;i<=m;++i) ++f[num[i]];
for(int i=1;i<(1<<n);++i){
int x=i;
while(x) x=(x-1)&x,++g[i];
g[i]=min(g[i],n-g[i]);
}
n=(1<<n);
XOR(f,1),XOR(g,1);
for(int i=0;i<n;++i) f[i]=f[i]*g[i];
XOR(f,0);
long long ans=(1<<30);
for(int i=0;i<n;++i) ans=min(ans,f[i]);
printf("%lld\n",ans);
return 0;
}

「CF662C」 Binary Table的更多相关文章

  1. 【CF662C】Binary Table(FWT)

    [CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...

  2. 【CF662C】Binary Table 按位处理

    [CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le ...

  3. 【CF662C】Binary Table

    题目 好吧,我连板子都不会了 有一个非常显然的做法就是\(O(2^nm)\)做法就是枚举每一行的状态,之后我们贪心去看看每一列是否需要翻转就好啦 显然这个做法非常垃圾过不去 首先我们发现每一列都不超过 ...

  4. [CF662C Binary Table][状压+FWT]

    CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) ...

  5. CF662C Binary Table【FWT】

    CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...

  6. 「2014-2-6」TokuMX and MongoDB related materials collection

    简介参考 TokuMX 和 MongoDB 各自的官方站点.       ##  Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...

  7. 「2014-2-26」Unicode vs. UTF-8 etc.

    目测是个老问题了.随便一搜,网上各种总结过.这里不辞啰嗦,尽量简洁的备忘一下. 几个链接,有道云笔记链接,都是知乎上几个问题的摘录:阮一峰的日志,1-5 还是值得参考,但是之后的部分则混淆了 Wind ...

  8. laravel4 「时间戳」问题

    默认 Eloquent 会自动维护数据库表的 created_at 和 updated_at 字段.只要把这两个「时间戳」字段加到数据库表, Eloquent 就会处理剩下的工作.如果不想让 Eloq ...

  9. 零元学Expression Blend 4 - Chapter 8 用实例了解布局容器系列-「Grid」

    原文:零元学Expression Blend 4 - Chapter 8 用实例了解布局容器系列-「Grid」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的是Blend 4 里的 ...

随机推荐

  1. [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion

    [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 (1 ...

  2. 重新整理 .net core 实践篇—————服务与配置之间[十一二]

    前言 前面基本介绍了,官方对于asp .net core 设计配置和设计服务的框架的一些思路.看下服务和配置之间是如何联系的吧. 正文 服务: public interface ISelfServic ...

  3. 一文读懂一条 SQL 查询语句是如何执行的

    2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头. 为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其 ...

  4. Docker学习(1) 初识

    Docker的使用场景 1 使用Docker容器开发,测试,部署服务 2 创建隔离的运行环境 3 搭建测试环境 4 构建多用户的平台及服务(PaaS)基础设施 5 提供软件即服务(SaaS)应用程序 ...

  5. Python_Selenium 之以login_page为例实现对basepage封装好的方法调用和对common中公共方法的调用

    目的:简化代码,提供框架该有的东西每一个函数 -提供了一个功能 - 公共的功能有了basepage,在PageObjects当中直接调用元素操作. 以下以login_page 为例,实现从配置文件中读 ...

  6. 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现

    内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...

  7. Git与GitHub入门

    一.git起步https://www.runoob.com/git/git-install-setup.html1.下载git(Windows)2.安装GUI(TortoiseGit)3.查看git配 ...

  8. 『动善时』JMeter基础 — 46、使用Badboy工具录制JMeter脚本

    目录 1.使用Badboy录制JMeter脚本 2.使用Badboy参数化配置 3.解决"当前页面的脚本发生错误"提示框 4.总结 1.使用Badboy录制JMeter脚本 打开B ...

  9. 解决git冲突

    多个开发者同时操作git中的同一个文件,第一个人在commit和push的时候是可以正常提交的,而之后的开发者执行pull,就会报冲突异常conflict. 解决方案: 全部采用当前更改 之后再去gi ...

  10. 利用 iOS 14 Vision 的手势估测功能 实作无接触即可滑动的 Tinder App

    Vision 框架在 2017 年推出,目的是为了让行动 App 开发者轻松利用电脑视觉演算法.具体来说,Vision 框架中包含了许多预先训练好的深度学习模型,同时也能充当包裹器 (wrapper) ...