听说这是一道$ Tourist$现场没出的题

Codeforces #662C

题意:

给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量

$ n<=20 \ m<=100000$


$ Solution$

考虑暴力

枚举每一行反转/不反转

预处理$ g(s)$表示某状态为$ s$的列的最少$ 1$的数量

显然$ g(s)=min(popcount(s),n-popcount(s))$

枚举每行是否反转之后直接$ O(m)$计算即可

时间复杂度$ O(2^n m)$,无法通过这题

容易发现瓶颈在于暴力枚举行状态之后无法快速计算答案

我们令$ f(s)$表示列状态为$ s$的列的出现次数,$ F(s)$表示行反转状态为$ s$的时候的答案

转移有$ F(s)=\sum\limits_{i=0}^{2^n-1}f(i)g(i \ xor \ s)$

由于$ i \ xor \ i \  xor \  s = s$

所以可以化简为$ F(s)=\sum\limits_{i \ xor \ j =s}f(i)g(j)$

是一个$ FWT$卷积的形式

直接$ FWT$优化

时间复杂度:$ O(nm+2^n n)$

注意$ FWT$过程中可能要开$ long \ long$


$ my \ code:$

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt,invn;
void fwt(int n,ll *a,int fla){
for(rt i=;i<n;i<<=)
for(rt j=;j<n;j+=i<<)
for(rt k=;k<i;k++){
ll x=a[j+k],y=a[i+j+k];
a[j+k]=x+y;a[i+j+k]=x-y;
}
if(fla==-)for(rt i=;i<n;i++)a[i]/=n;
}
char c[][];
int s[];ll f[],g[];
#define cnt(x) __builtin_popcount(x)
int main(){
n=read();m=read();
for(rt i=;i<=n;i++)scanf("%s",c[i]+);
for(rt i=;i<=n;i++)
for(rt j=;j<=m;j++)s[j]=s[j]<<|(c[i][j]=='');
for(rt i=;i<=m;i++)g[s[i]]++;
for(rt i=;i<(<<n);i++)f[i]=min(cnt(i),n-cnt(i));
fwt(<<n,f,);fwt(<<n,g,);
for(rt i=;i<<<n;i++)f[i]=f[i]*g[i];
fwt(<<n,f,-);
cout<<*min_element(f,f+(<<n));
return ;
}

Codeforces #662C Binary Table的更多相关文章

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

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

  2. CodeForces - 662C Binary Table (FWT)

    题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每 ...

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

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

  4. [Codeforces]663E Binary Table

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

  5. CF 662C Binary Table

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

  6. 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 ...

  7. Codeforces 417E Square Table(随机算法)

    题目链接:Codeforces 417E Square Table 题目大意:给出n和m.要求给出一个矩阵,要求每一列每一行的元素的平方总和是一个平方数. 解题思路:构造.依照 a a a b a a ...

  8. 【CF662C】Binary Table(FWT)

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

  9. 【CF662C】Binary Table 按位处理

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

随机推荐

  1. Mybatis 批量插入时得到插入的id(mysql)

    前言: 在开发中,我们可能很多的时候可能需要在新增时得到刚才新增的id,后续的逻辑需要用到这个id. 在插入单条记录的情况下,这个是很简单的问题.多条记录时有个坑在里面. 单条记录的代码如下 < ...

  2. express框架学习笔记

    用express框架也有一段时间了,下面我总结一下我做项目时迷惑的点: app.use()与app.get()的区别 app.use()是用来为应用程序绑定中间件的,当第一个参数是path是,第二个参 ...

  3. IntelliJ IDEA Cannot resolve symbol ''

    study from : https://www.cnblogs.com/linmengfei/p/7909196.html File->Invalidate Caches 点击File | I ...

  4. SWOT分析法——进行项目管理的高效方法

    SWOT分析法是什么 SWOT分析法,即态势分析法,就是将与研究对象密切相关的各种主要内部优势.劣势和外部的机会和威胁等,通过调查列举出来,并依照矩阵形式排列,然后用系统分析的思想,把各种因素相互匹配 ...

  5. POJ 1639 Picnic Planning 最小k度生成树

    Picnic Planning Time Limit: 5000MS   Memory Limit: 10000K Total Submissions:11615   Accepted: 4172 D ...

  6. (数学 尾0的个数) 51nod1003 阶乘后面0的数量

    n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. 收起   输入 一个数N(1 <= N <= 10^9) 输出 输出0的数量 输入样例 5 ...

  7. lucene和solr的区别(六)

    Lucene是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene的 ...

  8. Go-day06

    今日内容概要: 1.interface接口 2.反射 一.接口 接口定义 1.Interface类型可以定义一组方法,当时不需要实现,并且interface不能包含任何变量 2.接口定义 type e ...

  9. Spring入门初体验

    Spring其实就是一个容器,让我们更方便的拿到想要的对象. 1.编写一个service // userService.java public interface userService { publ ...

  10. Event Recommendation Engine Challenge分步解析第三步

    一.请知晓 本文是基于: Event Recommendation Engine Challenge分步解析第一步 Event Recommendation Engine Challenge分步解析第 ...