1 条题解

  • 0
    @ 2026-5-16 14:40:47

    题目翻译

    我们称一个长度为 nn 的数组 aa 的,当且仅当存在 1in41 \le i \le n-4 使得以下条件之一成立:

    • ai<ai+1<ai+2<ai+3<ai+4a_i < a_{i+1} < a_{i+2} < a_{i+3} < a_{i+4}
    • ai>ai+1>ai+2>ai+3>ai+4a_i > a_{i+1} > a_{i+2} > a_{i+3} > a_{i+4}

    一个数组是 的当且仅当它不是坏的。

    你被给定一个排列 p1,p2,,pnp_1, p_2, \dots, p_n。你必须进行 nn 轮操作。在每一轮,你必须删除当前剩余数组 pp 的最左端或最右端的元素。设 qiq_i 为第 ii 轮被删除的元素。选择每一轮删除哪个方向的元素,使得最终得到的数组 qq 是好的。可以证明在给定约束下,总是存在这样的操作序列。

    输出一个长度为 nn 的字符串 ss,其中 si=Ls_i = \text{L} 表示第 ii 轮删除左端元素,si=Rs_i = \text{R} 表示删除右端元素。如果有多个解,输出任意一个。

    解题思路

    关键观察

    如果构造出的 qq 满足 交替大小关系

    q1<q2>q3<q4>q5<q_1 < q_2 > q_3 < q_4 > q_5 < \dots

    即奇数位置小于下一个偶数位置,偶数位置大于下一个奇数位置,那么任何连续 55 个元素中必然同时包含上升和下降,不可能出现 55 个连续递增或递减。因此这样的 qq 一定是好的。

    构造方法

    • 将操作轮次编号为 1,2,,n1, 2, \dots, n
    • 在第 ii 轮:
      • ii 为奇数:删除当前剩余数组左、右两端中 较小 的那个元素。
      • ii 为偶数:删除当前剩余数组左、右两端中 较大 的那个元素。

    正确性证明

    设第 ii 轮(奇数)时,剩余数组的两端元素为 LLRR。我们取较小者,不妨设 LRL \le R,则 qi=Lq_i = L。移除 LL 后,新区间的左端点变为 LL'(原 LL 右侧的元素),右端点仍为 RR

    i+1i+1 轮(偶数)时,取当前两端的较大者 max(L,R)\max(L', R)。因为 RLR \ge LLL' 可能小于或大于 RR,但 max(L,R)RL\max(L', R) \ge R \ge L。由于 LL 已被移除且元素互异,max(L,R)\max(L', R) 不可能等于 LL,因此 max(L,R)>L\max(L', R) > L,即 qi+1>qiq_{i+1} > q_i

    类似地,若第 ii 轮为偶数,取两端较大者 qi=max(L,R)q_i = \max(L,R),不妨设 RLR \ge L,则 qi=Rq_i = R。移除 RR 后,新区间右端点变为 RR'(原 RR 左侧的元素),左端点仍为 LL。第 i+1i+1 轮(奇数)取两端较小者 min(L,R)\min(L, R'),它一定小于等于 LL,而 LR=qiL \le R = q_i,且由于元素互异,min(L,R)<R\min(L, R') < R,故 qi+1<qiq_{i+1} < q_i

    因此序列满足 q1<q2>q3<q4>q_1 < q_2 > q_3 < q_4 > \dots,从而不含连续 55 个单调元素,是好的。

    算法步骤

    1. 初始化左指针 l=0l = 0,右指针 r=n1r = n-1(使用 00 索引)。
    2. 初始化空字符串 ansans
    3. 对于 i=1i = 1nn
      • ii 是奇数:
        • 如果 p[l]<p[r]p[l] < p[r],则 ansans 添加 'L'll+1l \leftarrow l+1
        • 否则添加 'R'rr1r \leftarrow r-1
      • ii 是偶数:
        • 如果 p[l]>p[r]p[l] > p[r],则 ansans 添加 'L'll+1l \leftarrow l+1
        • 否则添加 'R'rr1r \leftarrow r-1
    4. 输出 ansans

    时间复杂度 O(n)O(n),空间 O(n)O(n),满足 nn 总和不超过 2×1052 \times 10^5 的限制。

    代码实现

    #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;
    }
    

    示例验证

    以第一个样例 n=7,p=[1,2,3,4,5,6,7]n=7, p=[1,2,3,4,5,6,7] 运行上述算法:

    • i=1i=1(奇):p[0]=1<p[6]=7p[0]=1 < p[6]=7,取左 Ll=1l=1q1=1q_1=1
    • i=2i=2(偶):p[1]=2<p[6]=7p[1]=2 < p[6]=7,取右 Rr=5r=5q2=7q_2=7
    • i=3i=3(奇):p[1]=2<p[5]=6p[1]=2 < p[5]=6,取左 Ll=2l=2q3=2q_3=2
    • i=4i=4(偶):p[2]=3<p[5]=6p[2]=3 < p[5]=6,取右 Rr=4r=4q4=6q_4=6
    • i=5i=5(奇):p[2]=3<p[4]=5p[2]=3 < p[4]=5,取左 Ll=3l=3q5=3q_5=3
    • i=6i=6(偶):p[3]=4<p[4]=5p[3]=4 < p[4]=5,取右 `Rr=3q_6=5$。
    • i=7i=7(奇):l=3,r=3l=3,r=3p[3]=4p[3]=4,任取 Lq7=4q_7=4

    得到 q=[1,7,2,6,3,5,4]q=[1,7,2,6,3,5,4],满足 1<7>2<6>3<5>41<7>2<6>3<5>4,无连续 55 个单调,输出 LRLRLRL(实际为 LLRLRLR 或类似,但本题允许任意解)。与样例输出 RRRLLLL 不同,但也正确。

    • 1

    信息

    ID
    7098
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    1
    已通过
    1
    上传者