OJ-Problems-Source/NBUTOJ/1667_wyg1997.cpp

81 lines
1.6 KiB
C++
Raw Normal View History

2016-08-07 20:13:48 +08:00
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int from,to;
int l;
}data[100011];
int main()
{
int u;
int n;
int num;
int a[100011];
int ans;
scanf ("%d",&u);
while (u--)
{
scanf ("%d",&n);
for (int i = 1 ; i <= n ; i++)
scanf ("%d",&a[i]);
num = 1;
ans = 1;
data[num].from = 1;
data[num].l = 1;
for (int i = 2 ; i <= n ; i++)
{
if (a[i] > a[i-1])
{
data[num].l++;
data[num].to = i;
ans = max (ans,data[num].l);
}
else
{
num++;
data[num].from = i;
data[num].to = i;
data[num].l = 1;
}
}
if (ans == n || ans == n-1) //特判一下
{
printf ("%d\n",n);
continue;
}
// if (ans == n - 1) //题目不清晰,不知道是否可以把该数改为负数
// {
// if ((a[1] < a[2]) || (a[1] >= a[2] && a[2] != 0))
// printf ("%d\n",n);
// else
// printf ("%d\n",ans);
// continue;
// }
ans++;
for (int i = 1 ; i < num ; i++)
{
if (data[i+1].l == 1 || data[i].l == 1) //子串长度为1挺麻烦的单独处理下
{
ans = max (ans , data[i+1].l + 1);
ans = max (ans , data[i].l + 1);
if (data[i+1].l == 1 && i != num-1)
{
if (a[data[i+1].to-1] + 1 < a[data[i+2].from])
ans = max (ans , data[i].l + data[i+2].l + 1);
}
}
else
{
if (a[data[i].to-1] + 1 < a[data[i+1].from]) //修改前一个子串的最后一个数
ans = max (ans , data[i].l + data[i+1].l);
if (a[data[i+1].from-1] + 1 < a[data[i+1].from+1]) //修改后一个子串的第一个数
ans = max (ans , data[i].l + data[i+1].l);
}
}
printf ("%d\n",ans);
}
return 0;
}