60求助
  • 板块P9147 签到题
  • 楼主_xEr_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/12 20:07
  • 上次更新2023/10/23 21:43:40
查看原帖
60求助
672815
_xEr_楼主2023/3/12 20:07

这一题我是保存区间进行判断的,赛时赛后都是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;
}
2023/3/12 20:07
加载中...