这一题我是保存区间进行判断的,赛时赛后都是60tps。
#include<iostream>
#define int long long
#define Max(i,j) i>j?i:j;
using namespace std;
struct qu{
int strat,end;
int first,last;
}b[10000009];
int n,s=1;
int a[1000009],ans;
main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
//a[i]=rand()%100;cout<<a[i]<<' ';
if(a[i]>a[i-1]&&i!=1)b[s].end++;
else{
if(i>1)b[s].last=a[i-1],s++;
b[s].first=a[i];b[s].strat=i;
b[s].end=i;
}
}
// puts("");
b[s].last=a[n];
if(s==1){
printf("%d",n);
return 0;
}
for(int i=1;i<=s;i++){
ans=Max(b[i].end-b[i].strat+2,ans);
// cout<<b[i].first<<' '<<b[i].last<<endl;
}
s=1;
for(int i=1;i<=n;i++){
// cout<<(a[i]-a[i-1]>1&&i!=1)<<endl;
if(a[i]-a[i-1]==1&&i!=1)b[s].end++;
else{
if(i>1)b[s].last=a[i-1],s++;
b[s].first=a[i];b[s].strat=i;
b[s].end=i;
}
}
//cout<<s<<' '<<ans<<endl;
//cout<<b[i+2].first<<' '<<b[i].last<<endl;
for(int i=1;i<=s-2;i++){
if(b[i+2].strat-b[i].end!=2)continue;
if(b[i+2].first-b[i].last<2)continue;
ans=Max(b[i].end-b[i].strat+1+b[i+2].end-b[i+2].strat+2,ans);
//cout<<b[i].end-b[i].strat+1<<' '<<b[i+2].end-b[i+2].strat+1<<endl;
}
cout<<ans;
}