连续的子序列,emmm,难度瞬间下降... 只要预处理出来两个数组,第一个是到i的时候,前面递增的最大数量,第二个是从后面往前递减的最大数量,然后假如a[i+1]-a[i-1]>2即可统计答案.. 代码如下:

#include <bits/stdc++.h> using namespace std; const int N=1e5+5; int a[N],l[N],r[N];//左边有多少连续比它小的 右边有多少连续比它大的 int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int cnt=0;int ans=1; for(int i=1;i<=n;i++) { if(a[i]>a[i-1]) { cnt++; l[i]=cnt; if(i!=n) ans=max(ans,l[i]+1); else ans=max(ans,l[i]); } else l[i]=1,cnt=1; }cnt=0; // for(int i=1;i<=n;i++) cout<<l[i]<<' '; // cout<<endl; for(int i=n;i>=1;i--) { if(a[i+1]>a[i]) { cnt++; r[i]=cnt; if(i!=1) ans=max(ans,r[i]+1); else ans=max(ans,r[i]); } else r[i]=1,cnt=1; } // for(int i=n;i>=1;i--) cout<<r[i]<<' '; // cout<<endl; for(int i=1;i<=n;i++) { if(a[i+1]-a[i-1]>1) ans=max(ans,l[i-1]+r[i+1]+1); } cout<<ans<<endl; return 0; }