CF662C Binary Table FWT
\(N \leq 20\)很小诶
一个暴力的思路是枚举行的翻转状态然后在列上贪心
复杂度为\(O(2^NM)\)显然过不去
考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策略肯定是相同的
考虑状压,设\(f_i\)表示初始状态为\(i\)的列的个数,\(g_i\)表示经过行反转,某一列到达\(i\)状态时,这一列留下的最少的\(1\)的可能个数,\(h_i\)表示行翻转状态为\(i\)时的答案
那么\(h_i = \sum\limits_{j\ xor\ k = i}f_jg_k\),是一个异或卷积的形式,FWT即可。
#include<bits/stdc++.h>
using namespace std;
long long cnt1[1 << 20] , mn[1 << 20] , times[1 << 20] , ans[1 << 20] , num[100007] , N , M;
void FWT_xor(long long* arr , int type){
for(int i = 1 ; i < 1 << N ; i <<= 1)
for(int j = 0 ; j < 1 << N ; j += (i << 1))
for(int k = 0 ; k < i ; ++k){
long long x = arr[j + k] , y = arr[i + j + k];
arr[j + k] = x + y;
arr[i + j + k] = x - y;
if(type == -1){
arr[j + k] >>= 1;
arr[i + j + k] >>= 1;
}
}
}
inline char getc(){
char c = getchar();
while(!isdigit(c))
c = getchar();
return c;
}
int main(){
cin >> N >> M;
for(int i = 1 ; i <= N ; ++i)
for(int j = 1 ; j <= M ; ++j)
num[j] = (num[j] << 1) + getc() - 48;
for(int i = 1 ; i <= M ; ++i)
++times[num[i]];
for(int i = 1 ; i < 1 << N ; ++i)
cnt1[i] = cnt1[i - (i & -i)] + 1;
for(int i = 1 ; i < 1 << N ; ++i)
mn[i] = min(cnt1[i] , cnt1[((1 << N) - 1) ^ i]);
FWT_xor(mn , 1);
FWT_xor(times , 1);
for(int i = 0 ; i < 1 << N ; ++i)
ans[i] = mn[i] * times[i];
FWT_xor(ans , -1);
long long all = M * N;
for(int i = 0 ; i < 1 << N ; ++i)
all = min(all , ans[i]);
cout << all;
return 0;
}
CF662C Binary Table FWT的更多相关文章
- [CF662C Binary Table][状压+FWT]
CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) ...
- CF662C Binary Table【FWT】
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, 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 ...
- CF662C Binary Table 【状压 + FWT】
题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 ...
- CF662C Binary Table 枚举 FWT
题面 洛谷题面 (虽然洛谷最近有点慢) 题解 观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转. 对于第i列,我们将它代表的01串提取出来,表示为\( ...
- CF662C Binary Table (FWT板题)
复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=if[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ...
- CF662C Binary Table (快速沃尔什变换FWT)
题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行), ...
- [CF662C] Binary Table(FWT)
题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:
- CodeForces - 662C Binary Table (FWT)
题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每 ...
随机推荐
- 【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用
在Android手机上, 在某个程序里,通过按Menu键,一般都会打开这个程序的设置,而在iOS里,系统提供了一个很好的保存程序设置的机制.就是使用Settings Bundle. 在按了HOME键的 ...
- MySQL主从复制--原理
简介 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一 ...
- Expo大作战(四十)--expo sdk api之 Calendar,Constants
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- vue权威指南笔记02——对比v-if与v-show
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- maven(六),外置maven运行环境配置
外置maven eclipse内置的maven插件是固定版本,如果要用其他版本的maven,可以使用外置maven 下载地址: http://maven.apache.org/download.cgi ...
- [20171221]利用rman实现2台机器文件拷贝.txt
[20171221]利用rman实现2台机器文件拷贝.txt --//昨天使用rman duplicate建立dg,我看到执行如下代码: RMAN> duplicate target datab ...
- asp.net mvc中的后台验证
asp.net mvc的验证包含后台验证和前端验证.后台验证主要通过数据注解的形式实现对model中属性的验证,其验证过程发生在model绑定的过程中.前端验证是通过结合jquery.validate ...
- vue中对axios进行封装
在刚结束的项目中对axios进行了实践(好不容易碰上一个不是jsonp的项目), 以下为在项目中对axios的封装,仅封装了post方法,因为项目中只用到了post,如有需要请自行进行修改 src/c ...
- HDU ACM 1224 Free DIY Tour (SPFA)
Free DIY Tour Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- spark-Scala
一.spark的特点 1.快速的 2.容易使用的 3.通用的 4.开放的 二.spark组件 sparkCore sparkSQL sparkStreaming MLibmachielearning ...