码迷,mamicode.com
首页 > 其他好文 > 详细

CF1467B Hills And Valleys

时间:2021-02-03 10:39:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:namespace   ace   std   while   复杂度   时间   val   getc   lan   

修改一座山可能同时改变其两侧山的类型。贪心地考虑,要么是修改成其左侧山的高度要么是修改成其右侧山的高度,这样能够在使得当前山不成为山峰和山谷的同时让两侧的山尽可能不成为山峰和山谷。

时间复杂度 \(O\left(\sum n\right)\)

#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define Max(x,y)((x)>(y)?x:y)
#define For(i,x,y)for(i=x;i<=(y);i++)
int a[N],hill[N];
int read()
{
	int A;
	bool K;
	char C;
	C=A=K=0;
	while(C<‘0‘||C>‘9‘)K|=C==‘-‘,C=getchar();
	while(C>‘/‘&&C<‘:‘)A=(A<<3)+(A<<1)+(C^48),C=getchar();
	return(K?-A:A);
}
int main()
{
	int t,ans,mx,i,n;
	t=read();
	while(t--)
	{
		n=read();
		ans=mx=0;
		For(i,1,n)a[i]=read(),hill[i]=0;
		For(i,2,n-1)
		{
			if(a[i]>a[i-1]&&a[i]>a[i+1])hill[i]=1,ans++;
			if(a[i]<a[i-1]&&a[i]<a[i+1])hill[i]=-1,ans++;
		}
		For(i,2,n-1)
		{
			mx=Max(mx,(hill[i-1]!=0)+(hill[i]!=0)+(hill[i+1]!=0)-(i!=n-1&&(a[i+1]>a[i-1]&&a[i+1]>a[i+2]||a[i+1]<a[i-1]&&a[i+1]<a[i+2])));
			mx=Max(mx,(hill[i-1]!=0)+(hill[i]!=0)+(hill[i+1]!=0)-(i!=2&&(a[i-1]>a[i+1]&&a[i-1]>a[i-2]||a[i-1]<a[i+1]&&a[i-1]<a[i-2])));
		}
		printf("%d\n",ans-mx);
	}
	return 0;
}
/*3
7
1 5 7 8 3 2 4
7
1 4 2 3 4 2 1
8
4 3 2 1 4 3 2 6*/

CF1467B Hills And Valleys

标签:namespace   ace   std   while   复杂度   时间   val   getc   lan   

原文地址:https://www.cnblogs.com/May-2nd/p/14361568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!