singing Everywhere

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);
		
	} 
 }