[Codeforces]663E Binary Table
某变换好题。不过听说还有O(2^n*n^2)DP的……
Description
给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少。
Input
第一行两个整数n,m。
接下来n行,每行m个字符,描述一个01矩阵。
Output
一个整数表示最少的1的数量。
Sample Input
3 4
0110
1010
0111
Sample Output
2
HINT
1 <= n <= 20,1 <= m <= 100000。
Solution
首先发现矩阵只有20行,经过一番脑补,可以把这二十行压成一个数。
然后我们就得到了m个数。
然后在行上的取反就相当于将这m个数同时异或上同一个数。
然后我们要求的就是,找出一个数,使得这m个数同时异或上这个数后,每个数的二进制位中的0和1的个数的最小值总和最小。
我们设ans[x]为当异或的数为x时的答案,a数组用来存放m个数,d[x]为x的二进制位中0和1的个数的最小值。
所以:
,
我们稍微改一改,用w[x]表示在m个数中,为x的数有多少个:
。
等等,是不是发现了什么?这不就是卷积FWT的式子吗?
。
时间复杂度O(nm+2^n*n)。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define MS 23
#define MN 100005
#define MM 1100005
using namespace std;
char c[MS][MN];
int a[MN];
ll A[MM],B[MM],C[MM];
int n,m,ans; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} void FWT(ll* a,int len,bool g)
{
register int wt,st,i;
ll x,y;
for (wt=;wt<len;wt<<=)
for (st=;st<len;st+=wt<<)
for (i=;i<wt;++i)
{
x=a[st+i]; y=a[st+wt+i];
a[st+i]=x+y; a[st+wt+i]=x-y;
if (g) a[st+i]>>=,a[st+wt+i]>>=;
}
} int main()
{
register int i,j;
n=read(); m=read(); ans=n*m;
for (i=;i<n;++i) scanf("%s",c[i]+);
for (i=n-;i>=;--i)
for (j=;j<=m;++j) a[j]=(a[j]<<)+c[i][j]-'';
for (i=;i<=m;++i) ++A[a[i]];
for (i=;i<(<<n);++i) B[i]=B[i>>]+(i&);
for (i=;i<(<<n);++i) B[i]=min(B[i],n-B[i]);
FWT(A,<<n,false); FWT(B,<<n,false);
for (i=;i<(<<n);++i) C[i]=A[i]*B[i];
FWT(C,<<n,true);
for (i=;i<(<<n);++i) ans=min(ans,(int)C[i]);
printf("%d",ans);
}
Last Word
如果把FWT中的if语句改成(x+y)/g,(x-y)/g,效率会慢5倍,除法真是个可怕的东西。
[Codeforces]663E Binary Table的更多相关文章
- [CodeForces 663E] - Binary Table(FWT)
题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code ...
- Codeforces #662C Binary Table
听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...
- Codeforces.662C.Binary Table(状压 FWT)
题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\le ...
- CodeForces - 662C Binary Table (FWT)
题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每 ...
- 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 ...
- Codeforces 417E Square Table(随机算法)
题目链接:Codeforces 417E Square Table 题目大意:给出n和m.要求给出一个矩阵,要求每一列每一行的元素的平方总和是一个平方数. 解题思路:构造.依照 a a a b a a ...
- 【CF662C】Binary Table(FWT)
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...
- 【CF662C】Binary Table 按位处理
[CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le ...
- CodeForces 1251B --- Binary Palindromes
[CodeForces 1251B --- Binary Palindromes] Description A palindrome is a string t which reads the sam ...
随机推荐
- Hibernate之ORM与Hibernate
ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...
- 关于搭建MyBatis框架(二)
由于在[关于使用Mybatis的使用说明(一)http://www.cnblogs.com/zdb292034/p/8675766.html]中存在不太完善地方,通过此片文档进行修订: 阅读指南:(1 ...
- 构建自己的 PHP 框架
这是一个系列的文章,项目地址在这里,欢迎大家star. 这个框架前一部分比较像Yii,后一部分比较像Laravel,因为当时正在看相应框架的源码,所以会有不少借鉴参考.捂脸- 这个框架千万不要直接应用 ...
- Lock(三)查看是谁把表给锁了
查看是谁把表给锁了 select se1.inst_id as 被阻塞的会话节点, se2.inst_id as 罪魁祸首节点, se1.sid as 被阻塞的会话ID, ob.object_name ...
- AngularJS1.X学习笔记10-自定义指令(下)
继续继续,学完这个部分就去吃饭.引用自由男人的话作为本文的开始:“默认情况下,链接函数被传入了控制器的作用域,而该控制器管理着的视图包含了指令所应用到的元素”.果然像是绕口令,还是看看你的例子比较好. ...
- 聊一聊C#的Equals()和GetHashCode()方法
博客创建一年多,还是第一次写博文,有什么不对的地方还请多多指教. 关于这次写的内容可以说是老生长谈,百度一搜一大堆.大神可自行绕路. 最近在看Jeffrey Richter的CLR Via C#,在看 ...
- 《深入实践Spring Boot》阅读笔记之一:基础应用开发
上上篇「1718总结与计划」中提到,18年要对部分项目拆分,进行服务化,并对代码进行重构.公司技术委员会也推荐使用spring boot,之前在各个技术网站中也了解过,它可以大大简化spring配置和 ...
- aws - shadow 影子使用
参考链接: https://github.com/aws/aws-iot-device-sdk-java 一.设备注册 二.设备主题
- C#实现导出Excel
这段时间用到了导出Excel的功能,这个功能还是比较常用的,我常用的有两个方法,现在整理一下,方便以后查看. 一.实现DataTable数据导出到本地,需要自己传进去导出的路径. /// <su ...
- 记录项目中用的laypage分页代码
最终才觉得,好记性不如烂笔头,毕竟已经不是刚毕业时候的巅峰了,精力有所下降,很多时候记不住东西. 参考url:http://www.layui.com/laypage/ 直接上代码了 <scri ...