Codeforces 1272D Remove One Element

思路:

将每一段连续的上升序列看成一个整体,然后挨个判断每两个相邻的整体是否可以合并;

代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
#define fi first
#define sc second
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define pt(a) cerr<<a<<"---\n"
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int maxn=2e5+99;
int arr[maxn];
vector<P> v;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n; cin>>n;
	rpn(i,n) cin>>arr[i];
	int p=1,q=2;
	while(q<=n){
		if(arr[q]>arr[q-1]) q++;
		else{
			v.pb(mp(p,q-1));
			p=q++;
		}
	}
	if(p!=n) v.pb(mp(p,n));
	int res=1; 
	for(P p:v) res=max(res,p.sc-p.fi+1);
	for(int i=1;i<v.size();i++){
		int a=v[i-1].fi,b=v[i-1].sc;
		int c=v[i].fi,d=v[i].sc;
		if(b-a>=1&d-c>=1){
			if(arr[b]<arr[c+1]||arr[b-1]<arr[c]) res=max(res,d-a);
		}
	}
	cout<<res;
	return 0;
} 
posted @ 2019-12-13 16:12  YuhanのBlog  阅读(96)  评论(0编辑  收藏  举报