CF662C Binary Table 枚举 FWT
题面
洛谷题面 (虽然洛谷最近有点慢)
题解
观察到行列的数据范围相差悬殊,而且行的数量仅有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\)时的最优解。
那么有
\]
考虑换一种枚举方式,我们枚举\(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]\)
因此答案就是:
\]
观察到\(i \oplus i \oplus b = b\),是一个定值。
因此上式等效于
\]
直接上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的更多相关文章
- CF662C Binary Table【FWT】
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...
- CF662C Binary Table (FWT板题)
复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=if[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ...
- [CF662C] Binary Table(FWT)
题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:
- [CF662C Binary Table][状压+FWT]
CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) ...
- 【CF662C】Binary Table(FWT)
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...
- CF662C Binary Table FWT
传送门 \(N \leq 20\)很小诶 一个暴力的思路是枚举行的翻转状态然后在列上贪心 复杂度为\(O(2^NM)\)显然过不去 考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策 ...
- CF662C Binary Table 【状压 + FWT】
题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 ...
- CF662C Binary Table (快速沃尔什变换FWT)
题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行), ...
- Codeforces663E Binary Table(FWT)
题目 Source http://codeforces.com/contest/663/problem/E Description You are given a table consisting o ...
随机推荐
- Apache入门篇(三)之apache2.4.33的新特性解析与虚拟主机实战
1.http 2.4新特性 新特性: (1) 在编译时可以将多个MPM构建为可加载模块,可以在运行时通过LoadModule指令配置所选的MPM: (2) 2.2版本的event MPM在实验阶段,到 ...
- Redis实现之客户端
客户端 Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复.通过使用 ...
- 【索引】MySQL索引
一.索引的定义及作用 1. 二.索引的创建及删除 1.1查看表的索引 show index from tblname; 1.2.创建索引 1.22创建普通索引 ALTER TABLE `table_n ...
- 解决windows 服务中定时器timer 定时偶尔失效 问题
最近做个windows 服务,功能是:定时执行一个任务:自动登录到一个网站后,点击相关网面上的按钮button. 在处理的过程中发现定时器老是不定时的失效,失效时间没有规律. 由于刚开始处于测试阶段, ...
- Python小白学习之如何添加类属性和类方法,修改类私有属性
如何添加类属性和类方法,修改类私有属性 2018-10-26 11:42:24 类属性.定义类方法.类实例化.属性初始化.self参数.类的私有变量的个人学习笔记 直接上实例: class play ...
- 视觉SLAM中的深度估计问题
一.研究背景 视觉SLAM需要获取世界坐标系中点的深度. 世界坐标系到像素坐标系的转换为(深度即Z): 深度的获取一共分两种方式: a)主动式 RGB-D相机按照原理又分为结构光测距.ToF相机 To ...
- Linux大全
Linux 基本指令介紹 一定要先學會的指令:ls, more, cd, pwd, rpm, ifconfig, find 登入與登出(開機與關機):telnet, login, exit, sh ...
- windows下Mysql安装启动及常用操作
1.下载mysql https://dev.mysql.com/downloads/ 2.配置环境变量 变量名:MYSQL_HOME 变量值:E:\MySql\mysql-8.0.15-winx64\ ...
- 高可用Kubernetes集群-10. 部署kube-proxy
十二.部署kube-proxy 1. 创建kube-proxy证书 1)创建kube-proxy证书签名请求 # kube-proxy提取CN作为客户端的用户名,即system:kube-proxy. ...
- Amazon.com Seller Distributed Inventory Placement Inventory Placement Service
Greetings, Thank you for writing to us. I understand that you would like to send inventory to our wa ...