题面

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

题解

观察到行列的数据范围相差悬殊,而且行的数量仅有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. 移动端推广APP防作弊机制之依我见

    本文来自网易云社区 在广告投放过程中,虚假流量常常给广告运营人员带来麻烦,影响广告投放的效果,如何预防作弊,不妨先来重现一下流量产生的场景,用户点击广告之后,一般都会落到广告主的网页,或者安装广告主的 ...

  2. Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  3. pytest使用笔记(一)

    使用环境及预置条件:pycharm+win10+python3.6+pytest 1,创建示范的测试功能脚本,另存为test_sample.py,代码如下: # test_sample.py def ...

  4. grunt requireJS 的基础配置

    module.exports = function(grunt){ //grunt的配置我就不叨叨了 自己看官网就ok了 //我就介绍下grunt的依赖插件grunt-contrib-requirej ...

  5. shell基础 -- grep、sed、awk命令简介

    在 shell 编程中,常需要处理文本,这里介绍几个文本处理命令. 一.grep 命令 grep 命令由来已久,用 grep 命令来查找 文本十分方便.在 POSIX 系统上,grep 可以在两种正则 ...

  6. CS231n assignment2

    preparation: solve the problem of `from builtins import rang` pip install future  update_rule

  7. “取件帮”微信小程序宣传视频链接及内容介绍

    1.视频链接 视频上传至优酷自频道,地址链接:http://v.youku.com/v_show/id_XMzg2NTM3OTc5Ng==.html?spm=a2hzp.8253869.0.0 2.视 ...

  8. Thunder团队第七周 - Scrum会议1

    Scrum会议1 小组名称:Thunder 项目名称:i阅app Scrum Master:杨梓瑞 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...

  9. AJAX请求.net controller数据交互过程

    AJAX发出请求 $.ajax({ url: "/Common/CancelTaskDeal", //CommonController下的CancelTaskDeal方法 type ...

  10. s2sh乱码一个小处理(新手按流程走)

    解决乱码几小点: 1.配置过滤器,可以选择自己写,既然你用的SSH框架就更简单了,直接用Spring的过滤器,web.xml里配置一下即可. 2.Jsp页面设置编码,所有地方都要相同,我习惯用GBK ...