听说这是一道$ 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:$

  1. #include<ctime>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #define rt register int
  9. #define ll long long
  10. using namespace std;
  11. inline ll read(){
  12. ll x = ; char zf = ; char ch = getchar();
  13. while (ch != '-' && !isdigit(ch)) ch = getchar();
  14. if (ch == '-') zf = -, ch = getchar();
  15. while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
  16. }
  17. void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
  18. void writeln(const ll y){write(y);putchar('\n');}
  19. int i,j,k,m,n,x,y,z,cnt,invn;
  20. void fwt(int n,ll *a,int fla){
  21. for(rt i=;i<n;i<<=)
  22. for(rt j=;j<n;j+=i<<)
  23. for(rt k=;k<i;k++){
  24. ll x=a[j+k],y=a[i+j+k];
  25. a[j+k]=x+y;a[i+j+k]=x-y;
  26. }
  27. if(fla==-)for(rt i=;i<n;i++)a[i]/=n;
  28. }
  29. char c[][];
  30. int s[];ll f[],g[];
  31. #define cnt(x) __builtin_popcount(x)
  32. int main(){
  33. n=read();m=read();
  34. for(rt i=;i<=n;i++)scanf("%s",c[i]+);
  35. for(rt i=;i<=n;i++)
  36. for(rt j=;j<=m;j++)s[j]=s[j]<<|(c[i][j]=='');
  37. for(rt i=;i<=m;i++)g[s[i]]++;
  38. for(rt i=;i<(<<n);i++)f[i]=min(cnt(i),n-cnt(i));
  39. fwt(<<n,f,);fwt(<<n,g,);
  40. for(rt i=;i<<<n;i++)f[i]=f[i]*g[i];
  41. fwt(<<n,f,-);
  42. cout<<*min_element(f,f+(<<n));
  43. return ;
  44. }

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. 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?

    在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...

  2. 利用twilio进行手机短信验证

    首先要注册 twilio 账号但是由于twilio人机验证用的是Goole所有注册需要FQ 完成后去免费获取15元使用 然后 pip install twilio 注册完成后会在个人首页显示你的免费金 ...

  3. Django(十八)Model操作补充

    参考博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 1. 创建类 class UserInfo(model.Model): age = ...

  4. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

  5. 在html页面通过js实现复制粘贴功能

    前言:要实现这个功能,常用的方式大概分为两类,第一种就是上插件,这个网上有大把,第二种就是直接用几行JS来实现. 这次说第二种实现方式,这方式有很大的局限性,只能用表单元素,并且不能设置disable ...

  6. 【译】2. Java反射——Class对象

    原文地址:http://tutorials.jenkov.com/java-reflection/classes.html ====================================== ...

  7. JS实现clone()方法,对五种主要数据类型进行值复制

    Object.Array.Boolean.Number.String 分为三种情况:普通变量,Array,Object 递归调用

  8. 简单贪心) Repair the Wall hdu2124

    Repair the Wall http://acm.hdu.edu.cn/showproblem.php?pid=2124 Time Limit: 5000/1000 MS (Java/Others ...

  9. NoClassDefFoundError com/google/inject/Injector

    一个maven项目莫名其妙的遇上了NoClassDefFoundError com/google/inject/Injector,在maven-surefire-plugin插件中配置 了<fo ...

  10. MySQL_参数设置

    1.max_allowed_packet 描述:有时备份数据库时,将本地psc文件备份到数据库时,会遇见备份不成功的情况 分析:这时要考虑,是否由于max_allowed_packet这个参数过小,导 ...