CF 633 E. Binary Table
题目大意:给定一个棋盘,棋盘上有0或1,你可以将一整行取反或者一整列取反,要使得最后剩的1最少。\((1\le n\le 20,1\le m\le 100000)\)。
一个容易想到的思路就是先枚举行是否取反,然后列就看1的个数是否大于\(\frac{n}{2}\)考虑是否取反。
我们设函数\(f(x)\)表示\(min(x_0,x_1)\),\(x\)在二进制状态下0或1最少的个数。
我们设行的取反状态为\(k\),每列的最终状态就是\(sta[i]\ xor\ k\),对答案的贡献就是\(f(sta[i]\ xor\ k)\)。
所以我们构造\(g(x)\)表示初始状态为\(x\)的列的数量。答案函数\(A(x)\)表示行的取反状态为\(x\)的答案,则\(A=f*g\)。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,m;
int s[25][100005];
ll f[1<<20],g[1<<20];
int Count(int s) {
int ans=0;
for(;s;s>>=1) ans+=s&1;
return ans;
}
void FWT_xor(ll *a,int n,int flag) {
for(int len=2;len<=n;len<<=1) {
for(int mid=len>>1,i=0;i<n;i+=len) {
for(int j=0;j<mid;j++) {
ll u=a[i+j],v=a[i+j+mid];
a[i+j]=u+v,a[i+j+mid]=u-v;
if(flag==-1) a[i+j]/=2,a[i+j+mid]/=2;
}
}
}
}
char t[100005];
int main() {
n=Get(),m=Get();
for(int i=1;i<=n;i++) {
scanf("%s",t+1);
for(int j=1;j<=m;j++)
s[i][j]=t[j]-'0';
}
for(int i=1;i<=m;i++) {
int now=0;
for(int j=1;j<=n;j++) now=(now<<1)|s[j][i];
g[now]++;
}
for(int s=0;s<(1<<n);s++) {
f[s]=Count(s);
f[s]=min(f[s],n-f[s]);
}
FWT_xor(f,1<<n,1),FWT_xor(g,1<<n,1);
for(int i=0;i<(1<<n);i++) f[i]*=g[i];
FWT_xor(f,1<<n,-1);
ll ans=1e9;
for(int i=0;i<(1<<n);i++) ans=min(ans,f[i]);
cout<<ans;
return 0;
}
CF 633 E. Binary Table的更多相关文章
- 【CF662C】Binary Table(FWT)
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...
- [CF662C Binary Table][状压+FWT]
CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) ...
- 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 ...
- CF 633 F. The Chocolate Spree 树形dp
题目链接 CF 633 F. The Chocolate Spree 题解 维护子数答案 子数直径 子数最远点 单子数最长直径 (最长的 最远点+一条链) 讨论转移 代码 #include<ve ...
- 【CF662C】Binary Table 按位处理
[CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le ...
- CF-1440C2 Binary Table (Hard Version) (构造,模拟)
Binary Table (Hard Version) 题意 \(n*m(2\le n,m\le 100)\) 的01矩阵,每次可以选择一个宽度为2的子矩阵,将四个位置中的任意3个进行翻转,即0变1, ...
- CF662C Binary Table【FWT】
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...
- 「CF662C」 Binary Table
「CF662C」 Binary Table 题目链接 题目所给的 \(n\) 很小,于是我们可以考虑这样一种朴素做法:暴力枚举第 \(i\) 行是否翻转,这样每一行的状态就确定了,这时取每一列 \(0 ...
- CF 662C Binary Table
用FWT优化计算. 首先发现行数很小,想到一个暴力的方法,就是以一个二进制位$0$表示这一行不翻转而二进制位$1$表示这一行翻转,然后$2^n$枚举出所有行的翻转情况,再$O(m)$计算所有的结果. ...
随机推荐
- spring boot 2.0 源码分析(一)
在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...
- 【JAVA WEB教程】jsp环境搭建(eclipse)【详细+图文】
下载JDK(如果你的系统是64位的,那么就下载64位版本的) 然后安装,点击下一步 再点击下一步 安装成功 下载针对JAVA EE的Eclipse(如果你的系统是64位的,那么就下载6 ...
- JavaWeb学习(二十二)———EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- 分析MySQL中哪些情况下数据库索引会失效
要想分析MySQL查询语句中的相关信息,如是全表查询还是部分查询,就要用到explain. 一.explain 用法:explain +查询语句. id:查询语句的序列号,上面图片中只有一个selec ...
- 常用的NoSQL数据库类型简述
一.文档存储类型(Document Stores) 文档存储,也称为面向文档的数据库系统,其主要特点在于它们的无模式的数据组织. 特点: 1.记录数据不需要具有统一的结构,即不同的记录可以具有不同的列 ...
- C# ABP源码详解 之 BackgroundJob,后台工作(一)
本文归属作者所有,转发请注明本文链接. 1. 前言 ABP的BackgroundJob,用来处理耗时的操作.比如客户端上传文件,我们要把文件(Excel)做处理,这耗时的操作我们应该放到后台工作者去做 ...
- Tests for Variances
In each case, we'll illustrate how to perform the hypothesis tests of this lesson using summarized d ...
- 解析<button>和<input type="button"> 的区别
一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...
- returnFunc.js
var cyn = function(){ console.log("one") return function(){ console.log("two") } ...
- java.lang.IllegalArgumentException Expected MultipartHttpServletRequest
解决方案:检查jar包,完毕无误后在Spring MVC的配置文件中加入: <!-- 需要文件上传功能时,启用以下配置 设置最大上传文件大小 10M=10*1024*1024(B)=104857 ...