题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数.

分析:本题可用FWT求解.

因为其0-1反转的特殊性且\(N\leq20\),将每一列j视作一个N位二进制数\(A[j]\),则一共有M个N位数,则可以统计出每个二进制数i的个数\(num[i]\).将所有的行反转操作组合也视作一个N位二进制数\(S\).

那么如何将本题与FWT结合? 首先根据异或运算的结合律:\(S\oplus A[j]=B\),则\(S = A[j] \oplus B\),\(B\)肯定也是一个N位二进制数.处理出每个二进制数对应最少的1的个数(因为我们可以将某一列也反转)\(B[j]\),则对于每一种行操作的组合\(S\),最后得到最少的1的个数即 \(cnt(S) = \sum_{i\oplus j = S}(num[i]*B[j])\).用FWT计算出每个操作组合\(S\)的最少1个数,最后扫一遍所有操作,求其最小值即可.

#include<bits/stdc++.h>
using namespace std;
const int MAXN = (1<<20)+5;
typedef long long LL; void FWT(LL a[] ,int n){
for (int d = 1 ; d < n ; d <<= 1){
for (int m = d << 1 ,i = 0;i < n ; i+=m){
for (int j = 0 ; j < d ; j++){
LL x = a[i+j],y = a[i+j+d];
a[i+j] = (x+y),a[i+j+d] = (x-y);
}
}
}
} void UFWT(LL a[],int n){
for (int d = 1 ; d < n ; d<<=1){
for (int m = d <<1, i = 0; i < n; i+=m){
for (int j = 0 ; j < d ; j++){
LL x = a[i+j],y = a[i+j+d];
a[i+j] = (x+y)/2; a[i+j+d] = (x-y)/2;
}
}
}
}
void solve(LL a[],LL b[],int n){
FWT(a,n);
FWT(b,n);
for (int i = 0 ; i<n ; i++)
a[i]=a[i]*b[i];
UFWT(a,n);
} LL A[MAXN],B[MAXN],num[MAXN];
char str[MAXN]; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N,M;
scanf("%d %d",&N, &M);
for(int i=0;i<N;++i){
scanf("%s",str);
for(int j=0;j<M;++j){
A[j] |= ((str[j]-'0')<<i);
}
}
for(int i=0;i<M;++i) num[A[i]]++;
for(int i=0;i<(1<<N);++i){
int cnt = __builtin_popcount(i);
B[i] = min(cnt,N-cnt);
}
int all = 1<<N;
solve(num,B,all);
LL ans = N*M;
for(int i=0;i<all;++i){
ans = min(ans,num[i]);
}
printf("%lld\n",ans);
return 0;
}

CodeForces - 662C Binary Table (FWT)的更多相关文章

  1. Codeforces #662C Binary Table

    听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...

  2. Codeforces.662C.Binary Table(状压 FWT)

    题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\le ...

  3. [CodeForces 663E] - Binary Table(FWT)

    题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code ...

  4. CROC 2016 - Final Round [Private, For Onsite Finalists Only] C. Binary Table FWT

    C. Binary Table 题目连接: http://codeforces.com/problemset/problem/662/C Description You are given a tab ...

  5. [Codeforces]663E Binary Table

    某变换好题.不过听说还有O(2^n*n^2)DP的…… Description 给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少. Input 第一行两个整数n,m ...

  6. CF662C Binary Table FWT

    传送门 \(N \leq 20\)很小诶 一个暴力的思路是枚举行的翻转状态然后在列上贪心 复杂度为\(O(2^NM)\)显然过不去 考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策 ...

  7. CF 662C Binary Table

    用FWT优化计算. 首先发现行数很小,想到一个暴力的方法,就是以一个二进制位$0$表示这一行不翻转而二进制位$1$表示这一行翻转,然后$2^n$枚举出所有行的翻转情况,再$O(m)$计算所有的结果. ...

  8. Codeforces 662C(快速沃尔什变换 FWT)

    感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/ar ...

  9. 【CF662C】Binary Table(FWT)

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

随机推荐

  1. ORACLE之常用FAQ V1.0

    [B]第一部分.SQL&PL/SQL[/B][Q]怎么样查询特殊字符,如通配符%与_[A]select * from table where name like 'A\_%' escape ' ...

  2. java泛型之泛型边界

    http://blog.csdn.net/renwuqiangg/article/details/51296621

  3. Android popupwindow 演示样例程序一

    经过多番測试实践,实现了popupwindow 弹出在指定控件的下方.代码上有凝视.有须要注意的地方.popupwindow 有自已的布局,里面控件的监听实现都有.接下来看代码实现. 项目资源下载:点 ...

  4. iOS开发之 -- 获取设备的唯一标示符

    各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...

  5. [SDOI2016 Round1] 征途[斜率优化]

    2225. [SDOI2016 Round1] 征途 ★★★☆   输入文件:menci_journey.in   输出文件:menci_journey.out   简单对比时间限制:1 s   内存 ...

  6. Tomcat Server启动报错:Multiple Contexts have a path of "/east".

    原因是 conf/server.xml 文件中多了一个<Context></Context>标签,路径有重复,把他删掉就好了.

  7. SQL server 数据库升级版本问题解决办法

    在升级或安装数据库的时候,会遇到数据库版本不对的问题,无论怎么升级,升级提示成功了,但打开数据库发现还是原来那个版本.甚至出现重装数据库之后,登陆页面已经提示安装的是新版本了,但登陆进去之后,发现数据 ...

  8. hibernate缓存,四种状态

    FlushMode.AUTO:Hibernate判断对象属性有没有改变,是默认的清理模式 FlushMode.COMMIT:在事务结束之前清理Session的缓存,其他任何时候都不清理缓存 Flush ...

  9. [SQL Database] 内外网数据库同步

    Azure SQL Azure(十) SQL Azure Data Sync数据同步功能(上) SQL Azure(十一) SQL Azure Data Sync数据同步功能(下) 走近微软云:SQL ...

  10. FW:主流RPC框架

    主流RPC框架  2015年10月27日  zman  RPC 介绍目前在互联网公司比较流行的开源的RPC框架. RPC框架比较   语言 协议 ​服务治理 ​社区 机构 Hessian 多语言 he ...