繁华模拟赛 最长上升子串
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; int n,a[300005],l[300005],r[300005],ans; int main(){ freopen("lis.in","r",stdin); freopen("lis.out","w",stdout); cin>>n; for(int i = 1;i <= n;i++) scanf("%d",&a[i]); for(int i = 1;i <= n;i++){ if(a[i] > a[i-1]) l[i] = l[i-1] + 1; else l[i] = 1; } r[n] = 1; for(int i = n - 1;i >= 1;i--){ if(a[i] < a[i+1]) r[i] = r[i+1] + 1; else r[i] = 1; } for(int i = 1;i <= n;i++){ if(a[i-1] <= a[i+1] - 2) ans = max(ans,l[i-1] + r[i+1] + 1); else ans = max(ans,l[i-1] + 1); } cout<<ans; return 0; } #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #include<cstdlib> #define INF 100000000 #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> pii; int a[300005],l[300005],r[300005]; int main() { int n,i,cou=0,ans=0; freopen("lis.in","r",stdin); freopen("lis.out","w",stdout); cin>>n; a[0]=0; a[n+1]=0; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) { if(a[i]>a[i-1]) { cou++; l[i]=cou; } else cou=1,l[i]=cou; } cou=0; for(i=n;i>=1;i--) { if(a[i]<a[i+1]) { cou++; r[i]=cou; } else cou=1,r[i]=cou; } for(i=1;i<=n;i++) { if(a[i-1]+1<a[i+1]) ans=max(ans,l[i-1]+1+r[i+1]); else { ans=max(ans,l[i-1]+1); ans=max(ans,r[i+1]+1); } } cout<<ans<<endl; return 0; } // davidlee1999WTK 2014/ // srO myk Orz //ios::sync_with_stdio(false);