AtCoder Beginner Contest 396-G - Flip Row or Col

news/2025/3/9 20:49:40/文章来源:https://www.cnblogs.com/djhjojo/p/18761346

https://atcoder.jp/contests/abc396/tasks/abc396_g
下面给出题目的中文思路、详细解释以及带中文注释的 C++ 实现代码。

代码实现

下面给出带中文注释的 C++ 代码:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;// 快速Walsh-Hadamard变换(FWHT)
// 参数 a 为待变换数组,参数 invert 为 false 时求正变换,为 true 时求反变换(需要除以数组大小)。
void fwht(vector<ll>& a, bool invert) {int n = a.size();for (int len = 1; len < n; len <<= 1) {for (int i = 0; i < n; i += (len << 1)) {for (int j = 0; j < len; j++) {ll u = a[i+j], v = a[i+j+len];a[i+j] = u + v;a[i+j+len] = u - v;}}}if (invert) {for (int i = 0; i < n; i++){a[i] /= n;}}
}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int H, W;cin >> H >> W;int size = 1 << W;  // 一共有 2^W 种可能的行模式// freq[mask] 记录每种行模式出现的次数vector<ll> freq(size, 0);for (int i = 0; i < H; i++){string s;cin >> s;int mask = 0;// 将字符串 s 转换为整数 mask(二进制表示)for (int j = 0; j < W; j++){mask = (mask << 1) | (s[j]-'0');}freq[mask]++;}// 构造数组 G,其中 G[x] = min(popcount(x), W - popcount(x))// 对于某一行模式 R,固定列翻转方案 C 后,// 若不翻转该行,贡献为 popcount(R XOR C);// 若翻转该行,贡献为 W - popcount(R XOR C);// 取两者中的较小值,即为 min(popcount(R XOR C), W-popcount(R XOR C))。// 将 R XOR C 换个变量记作 x,则我们令 G(x)=min(popcount(x), W-popcount(x))vector<ll> G(size, 0);for (int mask = 0; mask < size; mask++){int ones = __builtin_popcount(mask);G[mask] = min(ones, W - ones);}// 我们要求的 f(C) = sum_{R} freq[R] * G(R XOR C)// 这正是 freq 与 G 的 XOR 卷积 (freq ⊕ G)[C] 的定义:// (freq ⊕ G)[C] = sum_{R} freq[R] * G(C XOR R)// 因此,我们可以利用 FWHT 来求解所有 f(C)。// 对 freq 和 G 分别做 FWHTvector<ll> F = freq; // F 保存 freq 的变换结果vector<ll> Hvec = G; // Hvec 保存 G 的变换结果fwht(F, false);fwht(Hvec, false);// 逐点相乘vector<ll> conv(size, 0);for (int i = 0; i < size; i++){conv[i] = F[i] * Hvec[i];}// 对乘积结果做反变换,即得到 XOR 卷积结果fwht(conv, true);// conv[C] 即为 f(C) = sum_{R} freq[R] * G(R XOR C)// 答案为所有可能列翻转方案 C 中 f(C) 的最小值ll ans = LLONG_MAX;for (int i = 0; i < size; i++){ans = min(ans, conv[i]);}cout << ans << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/896095.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA-CSRF-Low

1.更改密码并使用BP抓包2.将抓到的数据包发送到重放模块,删除referer 内容,密码成功更改;referer不影响数据包请求结果,判断存在漏洞3.构造下面的index.html文件,其中的链接为更改密码链接 <!DOCTYPE html> <html lang="en"> <head><meta …

UE5之重定向Mixamo动画

首先将下载的fbx格式的角色导入UE5中,得到角色的骨骼,网格体,物理资产等,然后将fbx格式的动画也导入到UE中,选择刚刚导入的骨骼。 然后右键 动画---IK绑定---IK绑定,新建两个IK绑定Epic和Archer,分别选择刚刚导入的骨骼以及需要重定向的目标骨骼。在两处骨骼的头,左右手…

p44太阳花

from turtle import * color(red, yellow) begin_fill() while Ture:forward(200)left(170)if abs(pos()) < 1:break end_fill() done()

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序for i=1:Lekf-1z =…

Winform控件命名规则

C#控件命名规范控件分类控件名称命名规范说明数据显示控件DataGridViewdgv 数据绑定和定位控件BindingSourcebds BindingNavigatorbdn 文本编辑控件TextBoxtxt RichTextBoxrtxt MaskedTextBoxmtxt 信息显示控件Labellbl LinkLabelllbl StatusTripst ProgressBarpb 网页显示控件…

VMware中三种网络的区别

目录桥接模式仅主机模式NAT网络模式 桥接模式桥接模式 在Linux中,桥接模式通常指的是网络桥接(Network Bridging),它是一种将多个网络接口连接在一起的技术,形成一个局域网(LAN),使它们能够像在同一个网络中一样通信。仅主机模式仅主机网络 在仅主机模式下,虚拟网络是…

UE5之使用C++显示瞄准准星

1.创建控件蓝图 首先右键 用户界面---控件蓝图,创建一个控件蓝图CrosshairWidget,默认继承自UserWidget。在CrosshairWidget中新建一个Canvas Panel,再创建一个Image,加入准星图像并设置位置居中,这样准星的UI就完成了。 再添加一个图像,将其绘制为圆形盒体,这样就得到了…

20242802 2024-2025-2 《网络攻防实践》第二周作业

20242802 2024-2025-2 《网络攻防实践》第二周作业 目录 目录20242802 2024-2025-2 《网络攻防实践》第二周作业1. 实验要求2. 实验相关知识点nmap工具使用3. 实验详细过程3.1 从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:3.2尝试获取…

UE5之瞄准视角的俯仰偏移

1.创建瞄准姿势 复制瞄准动画,删除其中多余的帧,只保留瞄准的一帧,将其创建为一个单帧动画。然后将其复制成三份,分别用于表示瞄准三个姿势的up,middle,down。 将middle姿势动画的Additive动画类型修改为网格体空间,因为我们需要在网格空间创建叠加动画。基础姿势修改为…

2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!

"LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台,内置RBAC权限管理、工作流引擎、数据可视化、三方登录等核心模块,助力开发者快速构建企业级中后台管理系统"2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!"LikeAdmin J…

震惊!C++程序真的从main开始吗?99%的程序员都答错了

嘿,朋友们好啊!我是小康。今天咱们来聊一个看似简单,但实际上99%的C++程序员都答错的问题:C++程序真的是从main函数开始执行的吗? 如果你毫不犹豫地回答"是",那恭喜你,你和大多数人一样——掉进了C++的第一个陷阱!别担心,等你看完这篇文章,你就能成为那个与…