枚举,离散化,O(nlogn + n)
思路:枚举高度(对高度进行离散化处理),考虑变化的部分。学习y总的分析思路!
(算法题:先考虑一般化,再考虑边界) 边界情况:相邻小山等高,unique
去重,注意h[n + 1]
清空
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100010;
typedef pair<int, int> PII;
#define x first
#define y second
int n;
int h[N];
PII q[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> h[i];
n = unique(h + 1, h + n + 1) - h - 1; // 相邻元素去重
h[n + 1] = 0; // 后续代码可能会用到第n + 1个位置,需要把第n + 1个位置清空
// for(int i = 1;i <= n + 3;i ++ ) printf("%d ",h[i]);
// printf("\n");
for (int i = 1; i <= n; i ++ )
{
q[i] = {h[i], i}; // 把高度 离散化
}
sort(q + 1,q + n + 1);
int cnt = 1, res = 1;
for (int i = 1; i <= n; i ++ ) // 枚举高度
{
int k = q[i].y;
if(h[k - 1] > q[i].x && h[k + 1] > q[i].x) cnt ++ ; // 后续代码可能会用到第n + 1个位置
else if(h[k - 1] < q[i].x && h[k + 1] < q[i].x) cnt -- ;
if(q[i].x != q[i + 1].x)
res = max(res, cnt);
}
cout << res << endl;
return 0;
}