题面

洛谷题面 (虽然洛谷最近有点慢)

题解

观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转。

对于第i列,我们将它代表的01串提取出来,表示为\(v[i]\),

然后我们假设有第0列,其中的第i行如果是1,表示这行将会翻转。

那么可以发现,执行完对行的操作时,每一列的状态为\(x = v[i] \oplus v[0]\),此时我们只需要考虑对列的操作,令\(cnt[i]\)表示状态为\(i\)时01串中1的个数。

显然为了使得1的个数尽可能少,对于状态为\(x\)的列,产生的贡献为\(s[x] = min(cnt[x], n - cnt[x])\)

令\(ans[b]\)表示\(v[0] = b\)时的最优解。

那么有

\[ans[b] = \sum_{i = 1}^{m} s[v[i] \oplus b]
\]

考虑换一种枚举方式,我们枚举\(s[i]\),然后就只需要再找到使得\(v[j] \oplus b = i\)的\(j\)有多少个就可以快速算出贡献了。

\(v[j] \oplus b = i \Longrightarrow v[j] = i \oplus b\)

因此我们只需要找到有多少个\(v[j] = i \oplus b\)即可,令\(p[i]\)表示有多少列的状态为\(i\),

那么我们要求的个数即为\(p[i \oplus b]\)

因此答案就是:

\[ans[b] = \sum_{i = 0}^{2^n - 1} s[i] p[i \oplus b]
\]

观察到\(i \oplus i \oplus b = b\),是一个定值。

因此上式等效于

\[ans[b] = \sum_{i \oplus j = b} s[i] p[j]
\]

直接上FWT即可

#include<bits/stdc++.h>
using namespace std;
#define R register int
#define LL long long
#define AC 22
#define ac 100100
#define N 1050000 int n, m, maxn;
LL s[N], p[N], ans[N];
char ss[AC][ac]; inline void upmin(LL &a, LL b){if(b < a) a = b;} inline int cal(int x)
{
int rnt = 0;
while(x) rnt += x & 1, x >>= 1;
return rnt;
} void pre()
{
scanf("%d%d", &n, &m), maxn = 1 << n;
for(R i = 1; i <= n; i ++) scanf("%s", ss[i] + 1);
for(R i = 0; i <= maxn; i ++) s[i] = min(cal(i), n - cal(i));
for(R i = 1; i <= m; i ++)
{
int x = 0;
for(R j = 1; j <= n; j ++) x <<= 1, x += (ss[j][i] == '1');
++ p[x];
}
/* for(R i = 0; i < maxn; i ++) printf("%lld ", s[i]);
printf("\n");
for(R i = 0; i < maxn; i ++) printf("%lld ", p[i]);
printf("\n"); */
} void fwt(LL *A, int opt)
{
for(R i = 2; i <= maxn; i <<= 1)
for(R r = i >> 1, j = 0; j < maxn; j += i)
for(R k = j; k < j + r; k ++)
{
LL x = A[k], y = A[k + r];
A[k] = x + y, A[k + r] = x - y;
if(opt < 0) A[k] >>= 1, A[k + r] >>= 1;
}
} void work()
{
fwt(s, 1), fwt(p, 1);
for(R i = 0; i < maxn; i ++) ans[i] = s[i] * p[i];
fwt(ans, -1);
LL rnt = n * m;
for(R i = 0; i < maxn; i ++) upmin(rnt, ans[i]);
printf("%lld\n", rnt);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return 0;
}

CF662C Binary Table 枚举 FWT的更多相关文章

  1. CF662C Binary Table【FWT】

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

  2. CF662C Binary Table (FWT板题)

    复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=i​f[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ...

  3. [CF662C] Binary Table(FWT)

    题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:

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

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

  5. 【CF662C】Binary Table(FWT)

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

  6. CF662C Binary Table FWT

    传送门 \(N \leq 20\)很小诶 一个暴力的思路是枚举行的翻转状态然后在列上贪心 复杂度为\(O(2^NM)\)显然过不去 考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策 ...

  7. CF662C Binary Table 【状压 + FWT】

    题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 ...

  8. CF662C Binary Table (快速沃尔什变换FWT)

    题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行), ...

  9. Codeforces663E Binary Table(FWT)

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

随机推荐

  1. Arduino 101/Genuino101使用-第2篇

    1. Arduino 101编程只是在ARC的核心上进行,其具体架构为ARCv2EM.. 2. 而Quark核心,从目前可知的信息来看,其应该运行着名为Zephyr的RTOS 3.101并没有EEPR ...

  2. MySQL数据库之数据类型和完整性约束

    补充: select * from mysql.user #显示出来乱了 select * from mysql.user\G #加了\G后一行一行显示了 一.数据类型:分不同种类去存不同类型的数据 ...

  3. MindMaster安装教程以及激活破解教程

    原文地址:https://www.jianshu.com/p/16d2fc7d8e45 第一.激活必须首先断网 第二.运行安装程序,安装完成后先不要打开 第三.把Cracks文件夹下的文件复制到软件安 ...

  4. Appium+python 自动发送邮件(1)(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10056091.html) SMTP:简单传输协议,实在Internet上传输Email的事实标准. Python的s ...

  5. hdu6447

    YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. JavaScript学习笔记(一)——JS速览

    第一章 JS速览 1 限制时间处理事件 <script> setTomeout(wakeUpUser,5000); function wakeUpUser() { alert(" ...

  7. ip route ifconfig 基本命令

    1.route命令 route –n route add –net 192.168.2.0/24 dev eth0 route add –net 192.168.2.0 netmask 255.255 ...

  8. 论文笔记:Visual Object Tracking based on Adaptive Siamese and Motion Estimation Network

    Visual Object Tracking based on Adaptive Siamese and Motion Estimation 本文提出一种利用上一帧目标位置坐标,在本帧中找出目标可能出 ...

  9. 微软职位内部推荐-Senior Software Engineer II-Sharepoint

    微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...

  10. Scrum 项目6.0-展示Sprint回顾的过程及成果。

    6.0----------------------------------------------------- sprint演示 1.坚持所有的sprint都结束于演示. 团队的成果得到认可,会感觉 ...