当前位置: 首页 > news >正文

CF2193E Product Queries 题解

思路解析

本题解包含其他题解没想到的思路,建议阅读。

动态规划

考虑动态规划。

\(dp_i\) 表示 \(i\) 的最少元素个数,已经出现的数显然是 \(1\)。对于每个 \(i\)\(x\),若 \(i \cdot x \le n\),则 \(dp_{i \cdot x} = \min(dp_{i \cdot x}, dp_i + 1)\)。这里时间复杂度最坏是 \(O(n^2)\) 的。

对于每个 \(i\),若 \(x\)\(i\) 的因子,那么 \(\frac{x}{i}\) 一定也是 \(i\) 的因子。

也就是说,对于每个 \(i\),我们只需要枚举它的因子即可,这个东西是调和级数级别的,时间复杂度即为 \(O(n \log n)\)

时间复杂度 \(O(n \log n)\)

图论

考虑建图。

建图的方式非常简单,考虑转化为这样一个问题:若 \(u\)\(v\) 的真因子,那么 \(u\)\(v\) 之间有边。每条边的边权都是 \(1\)

然后就是直接广搜(BFS)求最短路即可(比赛的时候写了个 Dijsktra)。

时间复杂度 \(O(n \log n)\)

代码实现

动态规划


#include <bits/stdc++.h>
// #define DEBUG
using namespace std;
const int N = 3e5 + 5, inf = 0x3f3f3f3f;
vector<int> fac[N];
int T, n, a[N], dp[N];
bool vis[N];
signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);for (int d = 2; d <= N - 5; d++) {for (int i = d << 1; i <= N - 5; i += d) {fac[i].push_back(d);}}
#ifdef DEBUGcerr << "\nHere\n";
#endifcin >> T;while (T--) {#ifdef DEBUGcerr << "\nHere\n";
#endifcin >> n;for (int i = 0; i <= n; i++) {dp[i] = inf;vis[i] = false;}
#ifdef DEBUGcerr << "\nHere\n";
#endiffor (int i = 1; i <= n; i++) {cin >> a[i];if (a[i] <= n) {dp[a[i]] = 1;vis[a[i]] = true;}}
#ifdef DEBUGcerr << "\nHere\n";
#endiffor (int i = 1; i <= n; i++) {for (int d : fac[i]) {int j = i / d;if (vis[d] && dp[j] != inf) {dp[i] = min(dp[i], dp[j] + 1);}if (vis[j] && dp[d] != inf) {dp[i] = min(dp[i], dp[d] + 1);}}}
#ifdef DEBUGcerr << "\nHere\n";
#endiffor (int i = 1; i <= n; i++) {cout << (dp[i] == inf ? -1 : dp[i]) << " \n"[i == n];}
#ifdef DEBUGcerr << "\nHere\n";
#endif}return 0;
}

图论

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5, inf = 0x3f3f3f3f;
int T, n, a[N], dist[N];
bool vis[N];
vector<int> nums;
namespace Graph {
inline void init();
inline void Dijkstra();
} // namespace Graph
using namespace Graph;
signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> T;while (T--) {cin >> n;for (int i = 0; i <= n; i++) {vis[i] = false;}for (int i = 1; i <= n; i++) {cin >> a[i];if (a[i] <= n) {vis[a[i]] = true;}dist[i] = inf;}init();Dijkstra();for (int i = 1; i <= n; i++) {if (dist[i] == inf) {cout << -1;} else {cout << dist[i];}cout << " \n"[i == n];}}return 0;
}
namespace Graph {
inline void init() {nums.clear();for (int i = 1; i <= n; i++) {if (vis[i]) {nums.push_back(i);}}return;
}
inline void Dijkstra() {queue<int> q;for (int x : nums) {dist[x] = 1;q.push(x);}while (!q.empty()) {int u = q.front();q.pop();if (u <= n / nums[0]) {for (int x : nums) {if (u > n / x) {break;}int v = u * x;if (v <= n && dist[u] + 1 < dist[v]) {dist[v] = dist[u] + 1;q.push(v);}}}}return;
}
} // namespace Graph
http://www.jsqmd.com/news/370424/

相关文章:

  • 2026年宏邦机械行业口碑排名Top10,山东宏邦机械转台值得选吗 - 工业推荐榜
  • 口碑好的钢壳炉厂家推荐哪家?河南熔克电气实力凸显 - 工业品牌热点
  • Kafka 文件消费处理 + 文本切割
  • 2026年大润发卡回收平台哪家好?选择指南与操作建议 - 京回收小程序
  • 微算法科技(NASDAQ: MLGO)基于量子技术的区块链架构:量子原生验证模型与分布式账本革新
  • 2026年全国包装公司推荐,分析代代旺包装的产品质量能达标吗 - 工业品牌热点
  • K8s AIOps 一体化小系统(完整代码)
  • 中国十大老字号药企推荐:传承百年匠心,守护全民健康 - 包罗万闻
  • 探讨控制消防机器人遥控器价格及靠谱公司推荐 - myqiye
  • 【AI自动化】Claude Code + Playwright mcp + Python
  • 第十四天
  • 阅读笔记Day17
  • 外卖怎么点才不踩雷?美团外卖解锁省钱点餐新姿势! - Top品牌推荐
  • 2026!深圳旧房改造专业服务商权威推荐榜单 文小墙居首成优选! - 品牌评测官
  • 什么是反指纹浏览器?反指纹浏览器哪个好用?不了解的要看看! - Roxy指纹浏览器
  • 天猫享淘卡回收哪家好?2026年优胜平台列举 - 京回收小程序
  • js--18
  • 襄阳团购代运营首选:合肥三十六行(襄阳)分公司四大平台领跑 - 野榜数据排行
  • 使用Jumia API获取商品详情数据的技术实践
  • 苏州德力智仓:智慧仓储物流的技术引领者与价值共创伙伴 - 品牌策略主理人
  • 2026年受欢迎的直播排班软件排名,靠谱品牌推荐 - 工业设备
  • 西安石灰厂哪个品牌好,有哪些高性价比的值得推荐 - 工业设备
  • FPGA 项目为啥那么重要?
  • lazarus编写的程序在Ubuntu在任务栏或快捷栏不显示设定的图标
  • 2026年北京钢管公司排行榜,万泓泰钢管公司反馈怎么样 - 工业品网
  • 价格合理的有机肥生产线全套设备生产厂哪家值得选 - mypinpai
  • 天猫超市购物卡回收变现,京顺回收高效解决方案 - 京顺回收
  • 【好物推荐】告别重复输入!用 utools 超级文本片段打造跨应用的“实时模板”
  • 2026年北京旅行社选购指南,启程旅行社投诉处理情况如何要了解 - mypinpai
  • 分析黑龙江口碑好的中专学校,哈尔滨工大技工学校优势凸显 - 工业推荐榜