zoukankan      html  css  js  c++  java
  • ?Good Bye 2019 B. Interesting Subarray

    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;
        
    }
  • 相关阅读:
    leetcode1161
    leetcode1160
    校招真题练习034 倒水(贝壳)
    校招真题练习033 音乐列表(贝壳)
    校招真题练习032 连续相同字符串(头条)
    校招真题练习031 三支球队比分(头条)
    leetcode1144
    ArrayQueue(队列)
    LinkQueue(链队)
    快速幂
  • 原文地址:https://www.cnblogs.com/wyh447154317/p/12164383.html
Copyright © 2011-2022 走看看