singing Everywhere
找出出现峰值的点
处理那个点消失以及那个点左右的点不存在的情况
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
int d[100000+10];
int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
memset(d,0,sizeof(d));
vector<int >ans;
map<int ,int >mp;
int n;
scanf("%d",&n);
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&d[i]);
}
for(int i=1;i<n-1;i++)
{
if(d[i-1]<d[i]&&d[i]>d[i+1])
{
mp[i]=1;
sum++;
ans.push_back(i);
}
}
int anss=sum;
for(int i=0;i<ans.size() ;i++)
{
int c=sum;
int L=ans[i]-1,R=ans[i]+1;
if(L==0)
{
anss=min(sum-1,anss);
}
if(R==n-1)
{
anss=min(sum-1,anss);
}
if(L!=0&&d[L-1]>=d[ans[i]])
{
c--;
if(mp[L]) c--;
if(L-1==0)
{
}
else if(!mp[L-1]&&d[L-1]>d[ans[i]]&&d[L-1]>d[L-2])
{
c++;
}else if(mp[L-1]&&d[L-1]==d[ans[i]])
{
c--;
}
}
anss=min(anss,c);
c=sum;
if(R!=n-1&&d[R+1]>=d[ans[i]])
{
c--;
if(mp[R]) c--;
if(R+1==n-1)
{
}
else if(!mp[R+1]&&d[R+1]>d[ans[i]]&&d[R+1]>d[R+2])
{
c++;
}else if(mp[R+1]&&d[R+1]==d[ans[i]])
{
c--;
}
}
anss=min(anss,c);
c=sum-1;
if(L!=0) {
if(mp[L]&&d[R]>=d[L]&&d[L]<=d[L-1])
{
c--;
}else if(mp[L]==0&&d[R]<d[L]&&d[L]>d[L-1])
{
c++;
}
}
if(R!=n-1)
{
if(mp[R]&&d[L]>=d[R]&&d[R]<=d[R+1])
{
c--;
}else if(mp[R]==0&&d[R]>d[L]&&d[R]>d[R+1])
{
c++;
}
}
anss=min(c,anss);
}
printf("%d\n",anss);
}
}