$n \leq 20,m \leq 100000$的01矩阵,可整行整列01翻转,问最少剩几个1.

一个暴力的做法是枚举$2^n$种行翻转然后$m$列扫一遍。但其实在行翻转情况确定的情况下我们只关心两个东西:某一列在行翻转后剩几个1,以及有几个这样的列。$f(i,j)$--在行翻转$j$的情况下,有$i$个1的有多少列。其实就是与$j$有$i$个位不同的有多少列。可以枚举每一个位置$p$,那么这一位上与$j$不同的状态$f(i-1,j \ \ xor \ \ 2^p)$可以加过来,但要挑去其中$p$已经算过一次的情况,有$f(i-2,j)$这么多种,又要从$f(i-2,j)$中挑去那些$p$这一位算过一次的情况,$f(i-3,j \ \ xor \ \ 2^p)$,如此循环。但这样枚举完每个位置之后,每种好的情况其实算了$i$次,所以$i \times f(i,j)=\sum_{p=0}^{n-1} \sum_{t=1}^{i}(-1)^{t-1}f(i-t,j \ \ xor \ \ (2^p \times (t \mod 2)))$。

这样是$2^nn^3$的,但可以发现$\sum_{p=0}^{n-1}\sum_{t=3}^{i}(-1)^{t-1}f(i-t,j \ \ xor \ \ (2^p \times (t \mod 2)))=(i-2) \times f(i-2,j)$,所以整理一下,$i \times f(i,j)=\sum_{p=0}^{n-1}f(i-1,j \ \ xor \ \ 2^p)+(i-2-n)f(i-2,j)$。少一个$n$。

要再少一个得用FWT。不会。

 //#include<iostream>
#include<cstring>
#include<cstdio>
//#include<math.h>
//#include<set>
//#include<queue>
//#include<bitset>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int K,n;
#define maxn 1100011
int b[maxn],f[][maxn]; int main()
{
K=qread(); n=qread();
{
char c;
for (int i=;i<K;i++)
for (int j=;j<=n;j++)
{
while ((c=getchar())!='' && c!='');
b[j]|=(c-'')<<i;
}
for (int i=;i<=n;i++) f[][b[i]]++;
}
int T=<<K,ans=0x3f3f3f3f;
for (int i=;i<=K;i++)
{
for (int j=;j<T;j++)
{
if (i>) f[i][j]=(i--K)*f[i-][j];
for (int k=;k<K;k++) f[i][j]+=f[i-][j^(<<k)];
f[i][j]/=i;
}
}
for (int i=;i<T;i++)
{
int tmp=;
for (int j=;j<=K;j++) tmp+=min(j,K-j)*f[j][i];
ans=min(ans,tmp);
}
printf("%d\n",ans);
return ;
}

Codeforces663E. Binary Table的更多相关文章

  1. Codeforces663E Binary Table(FWT)

    题目 Source http://codeforces.com/contest/663/problem/E Description You are given a table consisting o ...

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

  3. 【CF662C】Binary Table(FWT)

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

  4. 【CF662C】Binary Table 按位处理

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

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

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

  6. CF-1440C2 Binary Table (Hard Version) (构造,模拟)

    Binary Table (Hard Version) 题意 \(n*m(2\le n,m\le 100)\) 的01矩阵,每次可以选择一个宽度为2的子矩阵,将四个位置中的任意3个进行翻转,即0变1, ...

  7. CF662C Binary Table【FWT】

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

  8. 「CF662C」 Binary Table

    「CF662C」 Binary Table 题目链接 题目所给的 \(n\) 很小,于是我们可以考虑这样一种朴素做法:暴力枚举第 \(i\) 行是否翻转,这样每一行的状态就确定了,这时取每一列 \(0 ...

  9. [Codeforces]663E Binary Table

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

随机推荐

  1. Js笔记 14

      <script> // <!-- 课 对象   // //对象的创建方法 // 1.var obj = {} plainobject 对象字面量 对象直接量 // 2.构造函数 ...

  2. 【wqs二分】HHHOJ#15. 赤

    这个wqs二分并不熟练…… 题目描述 #15. 赤 题目分析 两维都用wqs二分,其他没有什么特殊之处. 重点在于,wqs二分还原最优解的时候,增量是强制给的k. #include<bits/s ...

  3. 【dp】饥饿的牛

    普通dp题 题目描述 牛在饲料槽前排好了队.饲料槽依次用1到n(1 ≤ n ≤ 2000)编号.每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料. 约翰提供b个区间的清单.一个区间是一对整数 ...

  4. UVa 12171 题解

    英文题面不怎么友好,大家还是自行通过紫书了解题面吧... 解题思路: 1. 面对500 ^ 3的数据范围,我们需要先用离散化解决掉爆空间的问题. 2. 由于我们要求的总体积包括内空部分的体积,我们可以 ...

  5. Java JDBC的基本知识

    CallableStatement接口——主要调用数据库中的存储过程 即为一种方法,可以调用, 传递参数   delimiter // //这里是改变执行操作语句的分隔符,也就是将SQL语句的&quo ...

  6. DeepFaceLab小白入门(4):提取人脸图片!

    通过上面级片文章,你应该基本知道了换脸的流出,也能换出一个视频来.此时,你可能会产生好多疑问,比如每个环节点点到底是什么意思,那些黑漆漆屏幕输出的又是什么内容,我换脸效果这么差,该如何提升?等等,好奇 ...

  7. my购物车

    sum=0 a=input("请输入“水果”或“衣服”:") if a=="手机": while True: shop = { '蓝葡萄', '水蜜桃', '草 ...

  8. machine_desc

    每一个machine,都要定义一个自己的machine_desc结构,该结构定义了该machine的一些最基本的特性. struct machine_desc { unsigned int nr; / ...

  9. 在Unix系统上,从源文件、目标文件、可执行文件的编译过程

    是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, #include & ...

  10. LeetCode(226)Invert Binary Tree

    题目 分析 交换二叉树的左右子树. 递归非递归两种方法实现. AC代码 class Solution { public: //递归实现 TreeNode* invertTree(TreeNode* r ...