1 条题解
-
0
题目翻译
我们称一个长度为 的数组 是 坏 的,当且仅当存在 使得以下条件之一成立:
一个数组是 好 的当且仅当它不是坏的。
你被给定一个排列 。你必须进行 轮操作。在每一轮,你必须删除当前剩余数组 的最左端或最右端的元素。设 为第 轮被删除的元素。选择每一轮删除哪个方向的元素,使得最终得到的数组 是好的。可以证明在给定约束下,总是存在这样的操作序列。
输出一个长度为 的字符串 ,其中 表示第 轮删除左端元素, 表示删除右端元素。如果有多个解,输出任意一个。
解题思路
关键观察
如果构造出的 满足 交替大小关系:
即奇数位置小于下一个偶数位置,偶数位置大于下一个奇数位置,那么任何连续 个元素中必然同时包含上升和下降,不可能出现 个连续递增或递减。因此这样的 一定是好的。
构造方法
- 将操作轮次编号为 。
- 在第 轮:
- 若 为奇数:删除当前剩余数组左、右两端中 较小 的那个元素。
- 若 为偶数:删除当前剩余数组左、右两端中 较大 的那个元素。
正确性证明
设第 轮(奇数)时,剩余数组的两端元素为 和 。我们取较小者,不妨设 ,则 。移除 后,新区间的左端点变为 (原 右侧的元素),右端点仍为 。
第 轮(偶数)时,取当前两端的较大者 。因为 且 可能小于或大于 ,但 。由于 已被移除且元素互异, 不可能等于 ,因此 ,即 。
类似地,若第 轮为偶数,取两端较大者 ,不妨设 ,则 。移除 后,新区间右端点变为 (原 左侧的元素),左端点仍为 。第 轮(奇数)取两端较小者 ,它一定小于等于 ,而 ,且由于元素互异,,故 。
因此序列满足 ,从而不含连续 个单调元素,是好的。
算法步骤
- 初始化左指针 ,右指针 (使用 索引)。
- 初始化空字符串 。
- 对于 到 :
- 若 是奇数:
- 如果 ,则 添加
'L',; - 否则添加
'R',。
- 如果 ,则 添加
- 若 是偶数:
- 如果 ,则 添加
'L',; - 否则添加
'R',。
- 如果 ,则 添加
- 若 是奇数:
- 输出 。
时间复杂度 ,空间 ,满足 总和不超过 的限制。
代码实现
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { int n; cin >> n; vector<int> p(n); for (int i = 0; i < n; ++i) cin >> p[i]; int l = 0, r = n - 1; string ans; for (int i = 1; i <= n; ++i) { if (i & 1) { // 奇数轮:取较小端 if (p[l] < p[r]) { ans += 'L'; ++l; } else { ans += 'R'; --r; } } else { // 偶数轮:取较大端 if (p[l] > p[r]) { ans += 'L'; ++l; } else { ans += 'R'; --r; } } } cout << ans << '\n'; } return 0; }示例验证
以第一个样例 运行上述算法:
- (奇):,取左
L,,。 - (偶):,取右
R,,。 - (奇):,取左
L,,。 - (偶):,取右
R,,。 - (奇):,取左
L,,。 - (偶):,取右 `Rr=3q_6=5$。
- (奇):,,任取
L,。
得到 ,满足 ,无连续 个单调,输出
LRLRLRL(实际为LLRLRLR或类似,但本题允许任意解)。与样例输出RRRLLLL不同,但也正确。
- 1
信息
- ID
- 7098
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者