尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

题解:AtCoder ARC209D A_A_i

题解:AtCoder ARC209D A_A_i
📅 发布时间:2026/6/22 0:11:09

闲话

帅炸了。

这是主播被 \(n=1\) 的 case 卡爆了,望周知。

题意

给定长度为 \(n\) 的序列 \(a\),值域为 \([1,n]\),有一些位置未确定。你需要给这些未确定的位置的确定取值,使得序列 \(b_i=a_{a_i}\) 的字典序最小。多测,\(1\leq T\leq 10^5\),\(1\leq n\leq\sum{n}\leq 5\times 10^5\)。

题解

首先特判掉一些 corner case。

若 \(a_1=-1\lor a_1=1\),我们让所有 \(-1\) 的位置都填 \(1\) 显然最优。

若 \(a\) 中恰好有 \(1\) 个 \(-1\) 位于 \(pos\) 处,考虑若存在 \(i\) 使得 \(a_i>i\land a_i=pos\),我们就令 \(a_{pos}\gets 1\);否则我们令 \(a_{pos}\) 为最靠前的全局最小值的位置(注意这里求全局最小值时要先令 \(a_{pos}\gets pos\))。这是因为,如果存在 \(i\) 使得 \(a_i>i\land a_i=pos\),那么 \(b_i\) 要比 \(b_{pos}\) 更靠前,所以我们肯定优先把 \(b_i\) 置为 \(1\);否则我们就要让 \(b_{pos}\) 尽可能小,在此基础上,考虑到后面的一些满足 \(a_i=pos\) 的位置,我们还要令 \(a_{pos}\) 尽可能小,于是 \(pos\) 自然就取最靠前的全局最小值的位置了。

接下来考虑 \(a\) 中至少有 \(2\) 个 \(-1\) 的情况。

首先和前面一种 case 类似,若存在 \(i\) 使得 \(a_i>i\land a_{a_i}=-1\),则令 \(a_{a_i}\gets 1\)。

然后考虑所有 \(a_i=-1\) 的位置,不妨找出 \(a\) 中第一个 \(1\) 的位置 \(p\),\(\forall a_i=-1,a_i\gets p\)。若不存在 \(a_i=1\),则令 \(p\) 为最后一个 \(a_i=-1\) 的位置,强制令 \(a_p\gets 1\)。这样子除了最后一个位置,每个 \(-1\) 对应的 \(b\) 都能取到 \(1\),比较优秀。

但是可以发现,这样没有考虑到那些 \(a_i\neq -1\land a_i<i\land a_{a_i}=-1\) 的 \(i\) 对应的 \(b_i\) 的取值,换句话说,我们还要尽可能最小化 \(a_i\)。怎样可以进一步最小化 \(a_i\) 呢?可以发现,我们只能考虑提前把某个 \(-1\) 的位置置为 \(1\)。考虑最小的 \(i\) 使得 \(a_i\neq -1\land a_i<i\land a_{a_i}=-1\),那么显然 \(i\) 之前的 \(-1\) 不能动,于是考虑 \(i\) 之后第一个 \(j\) 满足 \(a_j=-1\),我们可以尝试把这个 \(a_j\) 置为 \(1\)。具体来说,我们直接令前文中找到的 \(p\) 和这个 \(j\) 取 \(\min\) 即可。

依照上述讨论实现即可。时间复杂度为 \(\mathcal{O}(\sum n)\)。

代码
#include <bits/stdc++.h>using namespace std;#define lowbit(x) ((x) & -(x))
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
const int N = 5e5 + 5;template<typename T> inline void chk_min(T &x, T y) { x = min(x, y); }
template<typename T> inline void chk_max(T &x, T y) { x = max(x, y); }int T, n, cnt, a[N];int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> T;while (T--) {cin >> n, cnt = 0;for (int i = 1; i <= n; ++i) cin >> a[i], cnt += a[i] == -1;if (cnt == 1) {int pos = 0, mnp = 0; bool flag = 0;for (int i = n; i; --i) {if (a[i] == -1) pos = i;else {if (a[i] == pos) { flag = 1; break; }if (!mnp || a[i] <= a[mnp]) mnp = i;}}if (!mnp) mnp = pos;if (pos < a[mnp] || (pos == a[mnp] && pos < mnp)) mnp = pos;a[pos] = flag ? 1 : mnp;} else if (a[1] == -1 || a[1] == 1) {for (int i = 1; i <= n; ++i) if (a[i] == -1) a[i] = 1;} else if (cnt) {for (int i = 1; i <= n; ++i) if (a[i] > i && a[a[i]] == -1) a[a[i]] = 1;int pos = 1;for (int i = 1; i <= n; ++i)if (a[i] == 1) { pos = i; break; }else if (a[i] == -1) pos = i;for (int i = 1; i <= n; ++i) if (~a[i] && a[i] < i && a[a[i]] == -1) {int p = i + 1;while (p <= n && ~a[p]) ++p;chk_min(pos, p); break;}for (int i = 1; i <= n; ++i) if (a[i] == -1) a[i] = pos;a[pos] = 1;}for (int i = 1; i <= n; ++i) cout << a[a[i]] << " \n"[i == n];}return 0;
}

相关新闻

  • Kotlin Coroutines
  • 我的标题
  • Java Benchmark使用

最新新闻

  • 2026昆明白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 2026年重庆混凝土预制构件厂家推荐:水篦子/路沿石/井盖/排水管/防撞墩等优质品牌全解析 - 品牌发掘
  • JMeter性能测试实战:从脚本执行到瓶颈定位的完整指南
  • G-Helper完整指南:免费开源华硕笔记本控制工具终极教程
  • 佛山本地推荐全封闭叛逆孩子学校十大招生简章一览 - 武汉中职最新信息发布
  • 3分钟掌握网盘高速下载:新一代直链工具完全指南

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号