每当下雨时,农夫约翰的田地总是被洪水淹没。
由于田地不是完全水平的,所以一些地方充满水后,留下了许多被水隔开的“岛”。
约翰的田地被描述为由 N N N 个连续高度值 H 1 , H 2 . . . . H n H_1 , H_2....H_n H1,H2....Hn 指定的一维场景。
假设该场景被无限高的围墙包围着,请考虑暴雨期间发生的情况:
最低处首先被水覆盖,形成一些不连贯的岛,随着水位的不断上升,这些岛最终都会被覆盖。
一旦水位等于一块田地的高度,那块田地就被认为位于水下。
上图显示了一个示例:在左图中,我们只加入了刚好超过 1 单位的水,此时剩下 4 个岛(最大岛屿剩余数量),而在右图中,我们共加入了 7 单位的水,此时仅剩下 2 个岛。
请计算,暴风雨期间我们能在某个时间点看到的最大岛屿数量。
水会一直上升到所有田地都在水下。
输入格式
第一行包含整数
N
N
N。
接下来 N N N 行,每行包含一个整数表示 H i H_i Hi。
输出格式
输出暴风雨期间我们能在某个时间点看到的最大岛屿数量。
数据范围:
1
≤
N
≤
1
0
5
1≤N≤10^5
1≤N≤105
1
≤
H
i
≤
1
0
9
1≤H_i≤10^9
1≤Hi≤109
分析:1.数据是离散的,也就是说雨水增长在两块田地之间是没有意义的
2.一次按序枚举每块田地的值,按照所有的这四种情况计算贡献,需要考虑边界情况
3.连续排列的需要去重,因为枚举的时候连续的两端情况是不知道的去重后,变为通过一块直接相连方便统计
#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 7;
int h[N];
int n;
PII p[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> h[i];
n = unique(h + 1 , h + n + 1) - h - 1; // 注意这里的unique只是把相邻相同的去除了,不是全部去重
for (int i = 1; i <= n; i ++ ) p[i] = {h[i] , i};
sort(p + 1 , p + n + 1);
int res = 1 , cnt = 1;
for (int i = 1; i <= n; i ++ )
{
int k = p[i].y;
if (h[k] > h[k - 1] && h[k] > h[k + 1]) cnt --;
if (h[k] < h[k - 1] && h[k] < h[k + 1]) cnt ++;
if (p[i].x != p[i + 1].x) res = max(res , cnt); // 当存在多个相同地段同时被淹时不做判断//无法判断此时的岛屿情况
}
cout << res << endl;
return 0;
}