题目链接

CF662C

题解

行比较少,容易想到将每一列的状态压缩

在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一

所以我们只需求出每一种操作的答案

如果操作的行的集合为\(S\),那么对于状态为\(e\)的列,将会变成\(e \; xor \; S\),同时产生\(e \; xor \; S\)的答案

如果\(s\)的答案记为\(b[s]\),状态为\(s\)的列数量为\(a[s]\)

那么对于操作\(S\),最后的答案为

\[\sum\limits_{i \; xor \; j = S}a[i] \centerdot b[j]
\]

而\(b[s]\)和\(a[s]\)数组都可以预处理出来

记\(N = 2^{20}\)

复杂度为\(O(NlogN)\)

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 2100005,maxm = 100005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
char S[22][100005];
int n,m;
LL A[maxn],B[maxn];
void fwt(LL* a,int n,int f){
for (int i = 1; i < n; i <<= 1)
for (int j = 0; j < n; j += (i << 1))
for (int k = 0; k < i; k++){
LL x = a[j + k],y = a[j + k + i];
a[j + k] = x + y,a[j + k + i] = x - y;
if (f == -1) a[j + k] /= 2,a[j + k + i] /= 2;
}
}
int main(){
n = read(); m = read();
REP(i,n) scanf("%s",S[i] + 1);
REP(j,m){
int s = 0;
REP(i,n) s = s << 1 | (S[i][j] - '0');
A[s]++;
}
int maxv = (1 << n) - 1;
for (int s = 0; s <= maxv; s++){
int cnt = 0;
for (int i = s; i; i >>= 1) cnt += (i & 1);
B[s] = min(cnt,n - cnt);
}
int deg = 1;
while (deg <= maxv) deg <<= 1;
fwt(A,deg,1); fwt(B,deg,1);
for (int i = 0; i < deg; i++) A[i] = A[i] * B[i];
fwt(A,deg,-1);
LL ans = INF;
for (int i = 0; i <= maxv; i++) ans = min(ans,A[i]);
printf("%lld\n",ans);
return 0;
}

CF662C Binary Table 【状压 + FWT】的更多相关文章

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

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

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

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

  3. CF662C Binary Table【FWT】

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

  4. CF662C Binary Table FWT

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

  5. CF662C Binary Table (快速沃尔什变换FWT)

    题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行), ...

  6. CF662C Binary Table 枚举 FWT

    题面 洛谷题面 (虽然洛谷最近有点慢) 题解 观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转. 对于第i列,我们将它代表的01串提取出来,表示为\( ...

  7. CF662C Binary Table (FWT板题)

    复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=i​f[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ...

  8. [CF662C] Binary Table(FWT)

    题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:

  9. [CF662C]Binary Table

    luogu 题意 你有一个\(n*m\)的\(01\)矩阵.你可以把任意一行或者一列的\(01\)取反.求矩阵中最少的\(1\)的数量. \(n\le20,m\le10^5\) sol 很自然地有一个 ...

随机推荐

  1. 【微服务架构】SpringCloud组件和概念介绍(一)

    一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...

  2. GIT问题(一)——push冲突

  3. 关于jQuery Form Plugin使用心得

    吐槽一下先 好久没开发了,今天遇到一个客户form提交的问题,想把form提交从同步变成ajax的异步方式,在网页接受返回来的数据,使用的是jquery from插件,于是网上搜了一圈,博客园,csd ...

  4. AssertionError

    (1)p1 = multiprocessing.Process(test1)p2 = multiprocessing.Process(target=test2) 错误: p1缺少target,应为(t ...

  5. codeforces 1140E Palindrome-less Arrays

    题目链接:http://codeforces.com/contest/1140/problem/E 题目大意: 如果一个数组的存在一个奇数长的回文就不好. 不是不好的数组是好的. 你可以把-1用1到k ...

  6. Apache 性能配置优化

    前言 最近在进行apache性能优化设置.在修改apache配置)文件之前需要备份原有的配置文件夹conf,这是网站架设的好习惯.以下的apache配置调优均是在red had的环境下进行的. htt ...

  7. [奇葩问题] Error Domain=NSURLErrorDomain Code=-1003

    问题描述: 新上线的产品,ios同事拿着一串报错来找我,日志如下:err =Error Domain=NSURLErrorDomain Code=-1003 "未能找到使用指定主机名的服务器 ...

  8. 20135332 第一次JAVA实验报告

    课程:Java程序设计          班级: 1353 姓名:武西垚               学号:20135332 成绩:             指导教师:娄嘉鹏       实验日期:2 ...

  9. 团队冲刺——Three

    第三天计划: 季方:学习爬虫的操作,以便后续功能实现: 司宇航:对当天实现的功能进行总的测试: 王金萱:数据库内数据的增删改查以及查看团队博客界面的实现: 马佳慧:学习css初步,进行页面绘制: 第二 ...

  10. Task 6.4 冲刺Two之站立会议7

    今天又重新对服务器部分加以分析改进,由于用户登录时必须得连接服务器,所以作为整个软件最核心的服务器的部分,只有保障了这个内容才能保证软件的正常运行.