CF558C Amr and Chemistry BFS解

news/2025/10/5 20:59:34/文章来源:https://www.cnblogs.com/Misaka2298/p/19127043

发现没人写 BFS,于是写了。

题意

给你 \(n\) 个正整数,可以将任意一个数字 \(x\) 变换为 \(2x\)\(\lfloor \frac{x}{2}\rfloor\),一次变换记为一次操作,现要求进行若干次操作使得所有 \(n\) 个数字相等,输出最小操作次数。

寻思

注意到操作对每个数字所带来的新状态数量都是 \(\log_{n}\) 级别的(因为乘和除的数都是 \(2\)),也就是如果我们将每个数字的所有可能出现的状态搜索出来,那么每次搜索的复杂度都应该是 \(O(\log_{n})\) 级别。

又注意到:\(n\) 的范围只有 \(1\le n \le10^5\),这样只要我们对每个数字做一遍 \(O(\log_{n})\) 的 BFS,之后 \(O(n)\) 统计答案即可。

这样,剩下的问题就只是如何把 BFS 限制到\(O(\log_{n})\) 级别了。

做法总结

对每个数(下文称为原始数字)做 BFS,搜索出来他们可能扩展出来的所有数字,记录所有原始数字到这一个数字的最小操作数。

搜索时还要记录 \(cnt\) 数组为“每个数字可以被多少个原始数字扩展到”。

搜完后扫一遍 \(cnt\) 数组,只有满足 \(cnt_i = n\)\(i\) 才考虑,也就是这个数要能被所有的原始数字扩展到才可能成为答案。

然后就是最关键的问题:如何把 BFS 限制到 \(O(\log_{n})\)

BFS 时判重有两种写法:

  • 记录距离数组,以 \(dist_i\) 是否有值来判断。
  • 记录访问数组,以 \(vis_i\) 是否为正来判断。

但是很可惜,我们要做 \(n\) 遍 BFS。而要实现上面的做法要么在每次 BFS 时都清空相关数组,要么开 \(n\) 个相关数组来供每次 BFS 使用。

而前者的时间复杂度是 \(O(n)\),后者的空间复杂度是 \(O(n^2)\),这都是我们不可接受的。

所以这里给出一种做法:时间戳判重

记录访问数组的方式判重,把访问数组开成整型,在每次 BFS 时给一个唯一的编号,在搜到一个新的数字时不再判断“是否为真”,而是“访问编号是否为当前的编号”,记录同理。这样就可以规避每次 BFS 时都清空访问数组,将每次 BFS 的时间复杂度控制在 \(O(\log_{n})\)

时间复杂度\(O(n\log_{n})\),空间复杂度\(O(n)\)

// Problem: CF558C Amr and Chemistry
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF558C
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// Time: 2025-10-05 08:44:56#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
typedef pair<int, int> PII;
typedef long long LL;// 觉得应该开就开了int n;
int cnt[maxn];// 记录这个数字能被多少原始数字扩展到
LL a[maxn];
LL dist[maxn];// 所有原始数字(注意)到这一个数字的最小操作数。
int vis[maxn], timestamp;// 访问数组与时间戳void bfs(LL sta)
{queue<PII> q;q.push({sta, 0});timestamp ++;// 给 BFS 一个唯一的编号(时间戳)vis[sta] = timestamp;cnt[sta] ++;while(q.size()){//auto [u, dis] = q.front(); q.pop();auto t = q.front(); q.pop();int u = t.first, dis = t.second;//dis 为当前这个数被当前原始数字扩展的最小操作数for(int i = 0 ; i < 2 ; i ++)// 因为是两个操作{LL ne = u;if(!i) ne *= 2;else ne /= 2;if(ne >= 1 && ne <= maxn && vis[ne] != timestamp)// 用时间戳来判重{vis[ne] = timestamp;dist[ne] += dis + 1;// 注意是 +=, 因为记录的是"所有"原始数字到这一个数字的最小操作数cnt[ne] ++;//ne 可以被这个原始数字搜到q.push({ne, dis+1});}}}
}signed main()
{ios::sync_with_stdio(false); cin.tie(nullptr);cin >> n;for(int i = 1 ; i <= n ; i ++)cin >> a[i];for(int i = 1 ; i <= n ; i ++)bfs(a[i]);LL mn = LLONG_MAX;// 注意!当然你用 INT_MAX 我觉得也不会错就是了。for(int i = 1 ; i < maxn ; i ++)if(cnt[i] == n)// 数字 i 能被所有 n 个数字扩展到mn = min(mn, dist[i]);// 记录最小的操作数cout << mn;
}

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

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

相关文章

刚做优化的网站什么能更新太原网站搜索优化

AI学习指南机器学习篇-线性回归在python中的实现sklearn 在机器学习领域中&#xff0c;线性回归是最为基础和常见的模型之一。它被广泛应用于预测和建模等领域&#xff0c;是我们学习机器学习的不二选择。 本篇博客将详细介绍如何使用Python中的sklearn库来实现一元和多元线性…

集成测试 maestro-我的第一个flow以及第一次云端测试 - 详解

集成测试 maestro-我的第一个flow以及第一次云端测试 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

深入解析:1、Pytorch介绍与安装

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Atbash密码和摩斯密码

一、 Atbash密码 Atbash Cipher是一种简单的替换密码,与凯撒相类似,区别在于Atbash密码使用的一般是前后字母互换。例如:ABCDEFGHIJKLMNOPQRSTUVWXYZ ZYXWVUTSRQPONMLKJIHGFEDCBA 同样的可以利用ASCII表转回进行解密…

Redis 中如何保证缓存与数据库的内容一致性?

Redis 中如何保证缓存与数据库的内容一致性?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

平顶山市哪里有做网站的个人团购网站 转入备案

I2C总线和通信协议详解 (超详细配42张高清图万字长文) I2C&#xff08;Inter-Integrated Circuit&#xff09;通信总线&#xff0c;作为嵌入式系统设计中的一个关键组成部分&#xff0c;其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析&…

SQL Indexes(索引) - 详解

SQL Indexes(索引) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

Payload CMS:开发者优先的Next.js原生开源解决优秀的方案,重新定义无头内容管理

Payload CMS:开发者优先的Next.js原生开源解决优秀的方案,重新定义无头内容管理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

CMS网站建设实战试题广东网页设计

&#x1f33f; 一、TestAppForlOS TestAppForlOS是一款运行在iOS系统上的测试应用程序。它可以用来测试iOS设备的硬件和软件性能&#xff0c;以及验证应用程序的兼容性和稳定性。该应用程序提供了多种测试工具&#xff0c;包括CPU、内存、存储器、网络等性能测试&#xff0c;同…

网站维护工作的基本内容苏州建设局网站首页

文章目录 1. Label 提示框1.1. 显示文本1.2. 修改Label的文本1.2.1. 方式1&#xff1a;通过label.config()1.2.2. 方式2&#xff1a;通过 label["text"] 属性进行修改 1.3. 设置背景图片 2. Tkinter 开发3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2…

07. 自定义组件

一、在单独文件中自定义组件我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载。 pip ins…

CF1611E2 Escape The Maze (hard version)

CF1611E2 Escape The Maze (hard version)题目简化 我在1号节点,你有k个朋友,分别在a1,a2,a3....ak的位置,在同一时间内可以移动1步,我不能和朋友走到同一个节点,如果我能走到叶节点,我就赢了,输出-1,否则必然…

P8186 [USACO22FEB] Redistributing Gifts S

P8186 [USACO22FEB] Redistributing Gifts S题目 每一个牛都有一个自己喜欢的排列,并且初始的时候,每只牛都是i,求经过n次交换后,每只牛能拿到的最喜欢的 我们来简化这n次操作,a1->a2,a2->a3,a3->a4,a4-…

重庆网站制品牌建设推荐

MySQL强制索引和禁止某个索引1、mysql强制使用索引:force index(索引名或者主键PRI)例如:select * from table force index(PRI) limit 2;(强制使用主键)select * from table force index(ziduan1_index) limit 2;(强制使用索引"ziduan1_index")select * from table …

做视频解析网站是犯法的么网站备案时间就是正式上线时间吗

题目描述 给出一个初始序列fA1;A2;:::Ang&#xff0c;要求你编写程序支持如下操作&#xff1a; 1. ADDxyD&#xff1a;给子序列fAx:::Ayg的每个元素都加上D。例如对f1,2, 3,4,5g执行"ADD 241" 会得到f1,3,4,5,5g。 2. REVERSExy&#xff1a;将子序列fAx:::Ayg翻转。例…

python语法记录

map()函数 A=[1,-3,5] A_abs = list(map(abs, A))map(func, A),把func函数作用到A的每个元素上,返回的是惰性迭代器,依次产出1,3,5,不能直接打印或索引; 用list()把它一次性拉出来,变成普通列表[1, 3, 5]。

怎么免费建立网站做推广天津雍鑫建设投资集团网站

问题描述 在Mac上安装git&#xff0c;双击pkg进行安装&#xff0c;报如下图错误&#xff1a; 解决办法 不要双击pkg文件&#xff0c;改成选中文件之后&#xff0c;鼠标右键&#xff0c;选择“打开方式->安装器&#xff08;默认&#xff09;”&#xff0c;即可继续安装。 转载…

详细介绍:Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Go 即时通讯体系:客户端与服务端 WebSocket 通信交互

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发持续更新wordpress广告设置

大数据开发&#xff08;Hadoop面试真题&#xff09; 1、Hive count(distinct)有几个reduce&#xff0c;海量数据会有什么问题&#xff1f;2、既然HBase底层数据是存储在HDFS上&#xff0c;为什么不直接使用HDFS&#xff0c;而还要用HBase?3、Spark map join的实现原理&#xf…