标签: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