1 条题解
-
0
题目回顾
给定一个长度为 的排列 ,构造一个长度为 的排列 ,满足: 对所有 ,有
核心解法
构造方案
直接令:
这个构造方式可以完美满足题目所有要求,且实现简单。
严谨证明
1. 证明 是一个合法排列
排列的定义:数组包含 的所有整数,无重复、无遗漏。
- 由构造公式得:
- 已知 是 的排列,即 ,因此:
- 因为 中所有元素互不相同,所以 也互不相同。
综上, 是 的合法排列。
2. 证明相邻和的
- 根据构造公式:
- 两个相等的数的最大公约数等于它本身:
- 题目约束 ,因此:
最终可得:
完全满足题目要求。
代码实现(C++)
#include <iostream> #include <vector> using namespace std; int main() { // 加速输入输出,应对大数据范围 ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n; cin >> n; for (int i = 0; i < n; ++i) { int x; cin >> x; // 核心构造公式 cout << n + 1 - x << " "; } cout << "\n"; } return 0; }
代码说明
- 输入优化:
ios::sync_with_stdio(false); cin.tie(nullptr);用于处理题目大数据量(); - 核心逻辑:对每个输入的 ,直接计算 并输出,就是答案排列 ;
- 效率:时间复杂度 ,空间复杂度 ,完全符合题目限制。
样例验证
以第一个样例为例: ?不影响正确性,题目允许任意合法解) 核心结论:所有相邻和都等于 , 必然满足条件。
总结
- 构造公式:;
- 该公式保证 是排列,且所有相邻和相等,;
- 代码极简,时间/空间效率最优,可直接通过所有测试用例。
- 1
信息
- ID
- 6489
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者