Codeforces Round #605 (Div. 3) D. Remove One Element
一个数组,最多可移除一个元素,问最长连续上升序列是多长
思路:就直接把连续的数组看成一个大元素,然后看相邻的两个大元素中,去掉前一个的尾元素或者去掉后一个的头元素是不是可以两个连起来,遍历一遍找到最大值即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define char char
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 2e5 + 5;
int n;
int num;
vector<int>vt[maxN];
int main()
{
scanf("%d", &n);
int cnt = 0;
int ans = 0;
for(int i = 1; i <= n; i ++ )
{
scanf("%d", &num);
int len = vt[cnt].size();
if(len == 0 || vt[cnt][len - 1] < num)
{
vt[cnt].push_back(num);
len ++;
}
else
vt[ ++ cnt ].push_back(num);
ans = max(ans, len);
}
for(int i = 0; i < cnt; i ++ )
{
int len1 = vt[i].size(), len2 = vt[i + 1].size();
if(len1 == 1 || len2 == 1)
{
ans = max(len1, ans);
ans = max(len2, ans);
}
else
{
if(vt[i][len1 - 2] < vt[i + 1][0] || vt[i][len1 - 1] < vt[i + 1][1])
ans = max(ans, len1 + len2 - 1);
}
}
printf("%d\n", ans);
return 0;
}