题解 CF1760D Challenging Valleys

大家好,我是 CQ-C2024 蒟蒻 CJH。

题意

给定数组 a0,,an1,请你找出一段 lr 的序列满足以下条件:

  1. 0lrn1

  2. al=al+1=al+2==ar

  3. l=0al1>al

  4. r=n1ar<ar+1

如果恰好只有一段符合以上条件的序列则输出 YES,否则输出 NO

分析思路

这里我们枚举在 0n1 中枚举左端点 l,再从 ln1 中找到最大的右端点 r 满足 ar=al

再判断是否满足条件 3 和条件 4 即可。

代码

//the code is from chenjh
#include<bits/stdc++.h>
using namespace std;
int a[200002];
void solve(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    //注意数组是从第 0 个开始输入。
    bool fl=0;//判断是否有解。
    for(int i=0;i<n;){//枚举左端点。
        int j;
        for(j=i;j<n && a[j]==a[i];j++);//右端点不断向右扩展。
        int l=i,r=j-1;//因为此时 j>=n 或 a[j]!=a[i],所以右端点为 j-1。
        if((l==0||a[l-1]>a[l]) && (r==n-1||a[r]<a[r+1])){//判断是否满足条件。
            if(fl){puts("NO");return;}//已经有一个解,不满足恰好只有一个解。
            else fl=1;//标记为有解
        }
        i=j;
    }
    puts(fl?"YES":"NO");//有解输出 "YES",无解输出 "NO"。
}
int main(){
    int t;scanf("%d",&t);
    while(t--) solve();
    return 0;
}

谢谢大家!

posted @   Chen_Jinhui  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

一言

不逆 不耻 不憾
——舰队Collection
点击右上角即可分享
微信分享提示