专栏文章

题解:CF2128B Deque Process

CF2128B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miom4160
此快照首次捕获于
2025/12/02 21:27
3 个月前
此快照最后确认于
2025/12/02 21:27
3 个月前
查看原文

题意

tt 组数据,每组给定一个长度为 nn 的数组 ana_n,要求通过移除最左段或最右段的元素进行重新排列,使得重新排列后的数组 qq 满足任意 55 个元素不单调,输出一种方案。

思路

我们可以使用双指针 llrr 分别表示最左段和最右段的元素,并取 llrr 中的最值,然后更新端点,初始状态下我们可以先取最大值,用 flagflag 来表示上一次取的是最大值还是最小值,那么就有 22 种情况。
  • 如果上次取的是最大值,即 flag=1flag=1,那么这一次我们就取最小值,并更新 flag=0flag=0
  • 如果上次取的是最小值,即 flag=0flag=0,那么这一次我们就取最大值,并更新 flag=1flag=1
取完最值后,根据取的端点更新 llrr 直至 l>rl>r,最后输出 ansans 即可。

证明

假设这一次我取的最大值是 ala_l,那么下一次我要取的最小值就是 al+1a_{l+1}ara_r 两者中的一个,因为这一次我取的最大值是 ala_l,那么显然 al>ara_l>a_r,此时我们分为两种情况讨论。
  • al+1<ara_{l+1}<a_r,那么我们就取 al+1a_{l+1} 为最小值,那么接下来就要在 al+2a_{l+2}ara_r 之间取最大值。如果取 al+2a_{l+2},那么说明 al+2>ar>al+1a_{l+2}>a_r>a_{l+1},显然满足不单调;如果取 ara_r,同理也满足不单调。
  • ar<al+1a_r<a_{l+1},显然同 al+1<ara_{l+1}<a_r 的情况。
综上,当我们不断取左右端点的最值时最后得到的排列肯定是不单调的,证毕。

Code

CPP
#include<bits/stdc++.h>
#define endl "\n"
#define int long long
#define N 100086
using namespace std;
int t,n,a[N];
inline int read();
signed main(){
    t=read();
    while(t--){
        string ans;
        int f=0;
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        int r=n;
        for(int i=1;i<=r;){
            if(!f){//初始状态或上一次取最小值时让f=0,以便这次取最大值
                if(a[r]>a[i]){
                    r--;
                    ans.push_back('R');
                }else ans.push_back('L'),i++;
                f=1;
            }else{//同上
                f=0;
                if(a[r]<a[i]){
                    r--;
                    ans.push_back('R');
                }else ans.push_back('L'),i++;//记得更新左右端点
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-48;ch=getchar();}
    return x*f;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...