rt,1A 90pts,样例和手造样例全过
//前面太长影响观感就截掉了
//思路:枚举每一个区间,第一次出现不符合要求的数数时进行修改,第二次出现更新答案并回到第一次的位置,正反跑两遍(过例4)
const int N = 1e6 + 10;
int n = read(), a[N], ans;
signed main()
{
for (int i = 1; i <= n; ++i) a[i] = read();
int l = 1, r = 1, Z46, H2016 = a[1], Z52 = 1;
bool Z47 = 0;
//Z46:第一次出现不符合要求数的位置
//Z47:是否出现过不符合要求的数
//H2016:这个位置的数应修改为什么
//Z52:目前区间长度
while (l < n && r < n) {
if (a[r + 1] > H2016) r ++, H2016 = a[r], Z52 ++;//符合要求
if (a[r + 1] <= H2016 && !Z47) {
Z47 = 1; Z46 = r + 1; H2016 = a[r] + 1;
r ++;
Z52 ++;//第一次出现不符合要求的数,将这个数改为前一个数+1
}
if (a[r + 1] <= H2016 && Z47) {
Z47 = 0;
l = r = Z46;
ans = max(ans, Z52);
Z52 = 1;
H2016 = a[r];//第二次出现,回到第一次位置,更新答案
}
}
ans = max(ans, Z52);
l = n, r = n, H2016 = a[n], Z52 = 1;
Z47 = 0;
while (l > 1 && r > 1) {
if (a[r - 1] < H2016) r --, H2016 = a[r], Z52 ++;
if (a[r - 1] >= H2016 && !Z47) {
Z47 = 1; Z46 = r - 1; H2016 = a[r] - 1;
r --;
Z52 ++;//将这个数修改为后一个数-1
}
if (a[r - 1] >= H2016 && Z47) {
Z47 = 0;
l = r = Z46;
ans = max(ans, Z52);
Z52 = 1;
H2016 = a[r];
}
}
ans = max(ans, Z52);
out(ans, 'l');
return 0;
}