40分,想不明白还有什么情况
查看原帖
40分,想不明白还有什么情况
181805
天马行空mz楼主2023/3/12 23:04
#include<bits/stdc++.h>
using namespace std;
#define TLE (double)clock() / CLOCKS_PER_SEC <= 0.95
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define maxn 2010000
int a[maxn];
int lx[maxn];//连续数量 
int flag[maxn];
int main()
{
	IOS;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		if(a[i]-a[i-1]>0) lx[i]=lx[i-1]+1;
		else lx[i]=1;
	}
	int ans=0;
	int pd=n;//当大于时说明在序列中 
	// for(int i=1;i<=n;i++) cout<<lx[i]<<" ";
	// cout<<endl;
	for(int i=n;i>=1;i--)
	{
		if(lx[i]==1&&lx[i-1]>=1)//截断点【开始点i和截断点i-1】 
		{
			if(lx[i+1]==1) ans=max(ans,lx[i-1]+1);//开始点为单独一个点
			else//开始点为一个序列开始
			{
				if(lx[i-1]>1)//截断点是另一个序列结尾
				{
					//cout<<"1:"<<i<<" "<<ans<<endl;
					if(a[i]-a[i-2]>1||a[i+1]-a[i-1]>1) ans=max(ans,lx[pd]+lx[i-1]);//开始点或截断点可以连接
					else ans=max(ans,max(lx[pd]+1,lx[i-1]+1));//不可连接就比较大小		
				}
				else//不是结尾
			    {
				    //cout<<"2:"<<i<<" "<<ans<<endl;
				    if(a[i]-a[i-2]>1&&lx[i-2]>1) ans=max(ans,lx[pd]+lx[i-1]+1);//判断是否是两个序列间隔一点
				    else ans=max(ans,lx[pd]+1);//啥也没有,单独判断该序列是否最大
				}			
			}
			//cout<<i<<" "<<a[i-2]<<" "<<a[i]<<" "<<pd<<lx[i-2]<<lx[pd]<<" "<<i<<" "<<ans<<endl;
			pd=i;
		}
		if(pd>0) continue;
		if(lx[i]>1) pd=i;
	}
	cout<<ans<<endl;
	return 0;
}
2023/3/12 23:04
加载中...