P8446 虹色的北斗七星 题解

题意:给定 $\{a_n\}$,找出一个区间,使得其极差减长度最大。

Subtask 1

特殊性质:$n\le5\times10^3$。$O(n^2)$ 枚举 $l,r$ 即可。

Subtask 2

特殊性质:所有的 $a_i$ 都相等。注意到所有区间的极差都是 $0$,最小区间长度为 $1$,输出 $-1$ 即可。

Subtask 3

不难发现,所求区间的两个边界一定对应两个最值。

证明:考虑反证法,设最优区间的一个边界不是最值。

将这个边界位置删除后,区间极差不变,长度 $-1$,得到了更优的区间,假设不成立。

分类讨论左右边界 $l,r$ 对应的最值。

  • $a_l=\min\limits_{_i=l}^ra_i,a_r=\max\limits_{i=l}^ra_i$ 时 $\max\limits_{i=l}^ra_i-\min\limits_{_i=l}^ra_i-r+l-1=(a_r-r)-(a_l-l)-1$。

  • $a_l=\max\limits_{i=l}^ra_i,a_r=\min\limits_{_i=l}^ra_i$ 时 $\max\limits_{i=l}^ra_i-\min\limits_{_i=l}^ra_i-r+l-1=(a_l+l)-(a_r+r)-1$。

问题转化为两个子问题:

  • 找出 $l,r$,使得 $1\le l\leq r\leq n$ 且 $(a_r-r)-(a_l-l)-1$ 最大。
  • 找出 $l,r$,使得 $1\le l\leq r\leq n$ 且 $(a_l+l)-(a_r+r)-1$ 最大。

原问题结果为两个子问题结果的最大值。

对于子问题一,枚举 $r$,维护前缀最小值 $x=\min\limits_{i=1}^r\{a_i-i\}$,用 $(a_r-r)-x-1$ 更新答案。

对于子问题二,枚举 $r$,维护前缀最大值 $y=\max\limits_{i=1}^r\{a_i+i\}$,用 $y-(a_r+r)-1$ 更新答案。

Code

#include <cstdio>
#include <algorithm>
using namespace std;
int n, x = 1e9, y = -1e9, q = -1e9;
int main()
{
    scanf("%d", &n);
    for(int i = 1, a, b, c;i <= n;++i)
    {
        scanf("%d", &a);
        x = min(x, b = a - i);y = max(y, c = a + i);
        q = max(q, b - x - 1);q = max(q, y - c - 1);
    }
    return printf("%d", q), 0;
}
posted @ 2022-07-27 19:53  Jijidawang  阅读(35)  评论(0)    收藏  举报  来源