Codeforces #662C Binary Table
听说这是一道$ Tourist$现场没出的题
题意:
给定$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的更多相关文章
- 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\),将每 ...
- [CodeForces 663E] - Binary Table(FWT)
题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code ...
- [Codeforces]663E Binary Table
某变换好题.不过听说还有O(2^n*n^2)DP的…… Description 给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少. Input 第一行两个整数n,m ...
- CF 662C Binary Table
用FWT优化计算. 首先发现行数很小,想到一个暴力的方法,就是以一个二进制位$0$表示这一行不翻转而二进制位$1$表示这一行翻转,然后$2^n$枚举出所有行的翻转情况,再$O(m)$计算所有的结果. ...
- 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 ...
随机推荐
- How MVC pattern Flows
以上MVC流程中Model和View不存在依赖关系 以上MVC流程View和Model存在耦合关系(依赖关系越少越好)
- GUI 设计
GUI(图形化界面编程) Graphical User Interface (java.Awt javax.Swing) CLI(命令行操作接口) Command line User ...
- 2. github创建 git仓库,克隆,拉取和推送操作(所有的git命令前提是一定在当前项目目录下)
步骤: 1.点击小猫,回到初始页面 2.点击start a project,首先会出现一个验证email地址(我们注册的时候,有一个email输入,进去邮箱验证一下) 3.重新点击start a pr ...
- postman 请求带cookie
以亚马逊为例,我抓包随便看一个返回是json数据格式的一个接口,比如随便点一个,我的订单 随便找一条,然后复制url过滤 右键,copy下url 将url放入filter过滤: 在postman里面, ...
- (count 或直接枚举) 统计字符 hdu1860
统计字符(很水) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1860 Time Limit: 1000/1000 MS (Java/Others) ...
- vmstat命令详解
一:简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个 ...
- maven的安装与基本使用
一.什么是maven,有什么用? Maven是一个项目构建和管理的工具,其主要服务于基于java平台的项目构建.依赖管理和项目信息管理.它包含了一个项目对象模型 (Project Object Mod ...
- MySql笔记一:安装MySql
MySql第一次安装之后,一定会报错,我遇到了十几种不同的错误,搜来搜去也没有搜出个结果.于是我重新卸载了MySql,卸载干净之后,下载MSI格式的MySql安装包,安装完之后,还是报错,如下图... ...
- JAVA核心技术I---JAVA基础知识(列表List)
一:List了解 (一)List:列表 –有序的Collection –允许重复元素 –{,,,{,},,} (二)List:主要实现 同步/非同步:针对线程而言 –ArrayList(非同步的) – ...
- canvas高级篇(转载)移动元素
本文转载在http://bbs.blueidea.com/thread-2979405-1-1.html 哈哈哈,好骚气!终于解决了我的需求.可以移动canvas内的多个元素 <!DOCTYPE ...