码迷,mamicode.com
首页 > 其他好文 > 详细

?Good Bye 2019 B. Interesting Subarray

时间:2020-01-08 00:54:12      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:n+1   lse   pre   mes   数列   ace   c++   等于   com   

https://codeforces.com/contest/1270/problem/B

思路:由样例发现公差为1的等差数列不满足条件

           对于∀的l,r   max(a)-min(a)=|r-l|<r-l+1

           由此想到若任意相邻两项差的绝对值为1 则不满足条件

           反过来若存在相邻两项差的绝对值大于1 这两项组成的子串就满足条件

           只要改变任意相邻两项差的绝对值为1的序列中的某一项,使得不满足任意相邻两项差的绝对值为1 就必存在字串满足条件

官方:不失一般性 max>min?

技术图片

 

 

 总共max-(min+1)+1=max-min项 故至少有一项大于等于2

 

 

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5 ;
int a[N];
int main(){
    int T;
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>T;
    while(T--){
        int n,flag1=0,flag2=0,pos1=0,pos2=0,flag=0;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
    /*    for(int i=2;i<=n;i++)
        if(a[i]!=a[i-1]+1){flag1=1;pos1=i;break;}
            for(int i=2;i<=n;i++)
        if(a[i]!=a[i-1]-1){flag2=1;pos2=i;break;
        }*/
        for(int i=2;i<=n;i++){
            if(abs(a[i]-a[i-1])>=2){cout<<"YES"<<endl;cout<<i-1<< <<i<<endl;flag=1;break;
            }
        }
    //    cout<<pos1<<‘ ‘<<pos2<<endl;
        if(!flag)cout<<"NO"<<endl;
    /*    else {
            cout<<"YES"<<endl;
            for(int i=1;i<n;i++){
                if(flag) break;
                int m1=a[i],m2=a[i];
            for(int j=i+1;i<=n;i++){
                m1=min(m1,a[j]);m2=max(m2,a[j]);
                if(m2-m1>=j-i+1){
                    cout<<i<<‘ ‘<<j<<endl;flag=1;break;
                }
            }
        }
        /*    int m1=a[pos1],m2=a[pos1];
            for(int i=pos1+1;i<=n;i++){
                m1=min(m1,a[i]);m2=max(m2,a[i]);
                if(m2-m1>=i-pos1+1){
                    cout<<pos1<<‘ ‘<<i<<endl;flag=1;break;
                }
            }
            if(!flag){
            
             m1=a[pos2],m2=a[pos2];
            for(int i=pos2+1;i<=n;i++){
                m1=min(m1,a[i]);m2=max(m2,a[i]);
                if(m2-m1>=i-pos2+1){
                    cout<<pos2<<‘ ‘<<i<<endl;flag=1;break;
                }
            }
        }
            if(!flag){
            
             m1=a[1],m2=a[1];
            for(int i=2;i<=n;i++){
                m1=min(m1,a[i]);m2=max(m2,a[i]);
                if(m2-m1>i){
                    cout<<1<<‘ ‘<<i<<endl;flag=1;break;
                }
            }
            }
            if(!flag){
            
             m1=a[n],m2=a[n];
            for(int i=n-1;i>=1;i--){
                m1=min(m1,a[i]);m2=max(m2,a[i]);
                if(m2-m1>n-i+1){
                    cout<<i<<‘ ‘<<n<<endl;flag=1;break;
                }
            }
            }*/
    /*    }*/
          
    
    
        
    }
    return 0;
    
}

?Good Bye 2019 B. Interesting Subarray

标签:n+1   lse   pre   mes   数列   ace   c++   等于   com   

原文地址:https://www.cnblogs.com/wyh447154317/p/12164383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!