专栏文章

题解:CF1270B Interesting Subarray

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

文章操作

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

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

题意

tt 组数据。
给你一个包含 nn 个正整数的序列 aa,你需要从中找到一个连续子序列,使得这个连续子序列的最大值减最小值的差大于等于这个连续子序列的元素个数。如果能找到,还要输出一种构造方案。

分析

明显发现,如果这个序列所有长度为 22 的连续子序列都不符合要求,那么答案显然无解,反之有解。
那么问题来了,为什么长度为 11,长度为 33,或者更长的不行呢?
我们一个一个看。
  1. 如果长度为 11,那么最大值和最小值均为本身,那么最大值减最小值为 00,不符合要求。
  2. 如果长度为 33 或者更大,我们发现,他的存在是基于长度为 22 的连续子序列不存在的情况下而诞生的,但是我们发现,如果长度为 22 的连续子序列都找不到,那么长度为 33 的连续子序列就更找不到了,更何况更大的呢。 因为你没有任何一种情况满足长度为 22 的子序列不符合要求,但是长度为 33 的子序列却符合要求了。所以不符合要求。

总结

综上所述,如果说长度为 22 的连续子序列没有符合情况的,那么就无解,否则输出这两个数的位置即可。

代码

CPP
//By xiaozhou001
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int t,n,a[N],flag;
int main()
{
    ios::sync_with_stdio(false);//解除cin/cout的流绑定
    cin>>t;
    while(t--){
        flag=1;//一定要注意多测清空
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];//我是输入
        for(int i=1;i<n;i++)
            if(abs(a[i]-a[i+1])>=2){//我是判断
                cout<<"YES"<<endl<<i<<" "<<i+1<<endl;//输出有解情况
                flag=0;//代表已经找到了一组解
                break;//一种情况就够了,SPJ会帮你扫清一切障碍
            }
        if(flag)cout<<"NO"<<endl;//无解
    }
    return 0;
}

评论

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

正在加载评论...