#include<bits/stdc++.h>
using namespace std;
int a[500005];
int cnt[10005]={0};
int main()
{
/*
转化为海平面下降问题,非零段为俩个孤立的海岛,当海平面低于凸峰时,海岛++;当海平面低于凹谷时,海岛--
*/
int n,m;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",a+i);
a[0]=a[n+1]=0; //边界默认为0
n=unique(a,a+n+2)-a; //去掉相邻重复元素
for(int i=1; i<n-1; i++)
if(a[i-1]<a[i]&&a[i]>a[i+1]) //大于左右则为凸峰,对答案贡献了1。因去重,不存在等于左右情况
cnt[a[i]]++;
else if(a[i-1]>a[i]&&a[i]<a[i+1])
cnt[a[i]]--;
int ans=0,sum=0;
for(int i=10000; i>0; i--)
{
sum+=cnt[i]; //差分的前缀和即为单点的答案
ans=max(ans,sum);
}
printf("%d\n",ans);
}
从大佬那里看来的思路,转化为海平面下降问题:即非零段为俩个孤立的海岛,p为海平面高度,当p为最大值时,所有岛均被淹没,既没有非零段,然后p逐渐减小,即海平面逐渐下降;当海平面低于凸峰时,海岛裸露出来,海岛++;当海平面低于凹谷时,海岛重新相连,海岛--
当然,本题还要用uniqie函数去除相邻重复元素,因为不会影响结果