Singing Everywhere
一开始的代码,时间复杂度仍然是线性的,但是仅仅因为常数过大,还是超时了。。。
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define ull unsigned long long
#define INF0x3f3f3f3f
const int dx[] ={-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int a[100005],n;
bool v[100005];
int main(){
int t;
cin>>t;
while (t--)
{
ms0(v);
ms0(a);
scanf("%d",&n);
if(n<=2)
{
printf("%d\n",0);
continue;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ans = 0;
for(int i=2;i<=n-1;i++)
{
if(a[i-1]<a[i] && a[i]>a[i+1])
{
ans++;
v[i]=1;
}
}
int temp,res=0;
for(int i=2;i<=n-1;i++)
{
temp=0;
if(v[i])
{
temp++;
if(i+2<=n && a[i+1]>a[i-1] && a[i+1]>a[i+2])
{
temp--;
}
if(i-2>=1 && a[i-1]>a[i+1] && a[i-1]>a[i-2])
{
temp--;
}
}
else
{
if(v[i-1])
{
if(a[i-1]<=a[i+1])
{
temp++;
}
}
else
{
if(i-2>=1 && a[i-1]>a[i+1] && a[i-1]>a[i-2])
{
temp--;
}
}
if(v[i+1])
{
if(a[i+1]<=a[i-1])
{
temp++;
}
}
else
{
if(i+2<=n && a[i+1]>a[i-1] && a[i+1]>a[i+2])
{
temp--;
}
}
}
res = max(res,temp);
}
temp=0;
if(v[2]){
temp++;
}
res = max(res,temp);
temp=0;
if(v[n-1]){
temp++;
}
res = max(res,temp);
printf("%d\n",ans-res);
}
return 0;
}
AC代码:
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define ull unsigned long long
#define INF0x3f3f3f3f
using namespace std;
const int maxn = 1e5+6;
ll a[maxn];
int n;
int main(){
int t;
cin>>t;
while (t--)
{
ms0(a);
scanf("%d",&n);
a[0]=a[n+1]= 1e12;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
int sum = 0;
for(int i=2;i<=n-1;i++)
{
if(a[i-1]<a[i] && a[i]>a[i+1])
sum++;
}
int res=0;
for(int i=2;i<=n-1;i++)
{
int ans = 0,ans1 = 0;
if(a[i]>a[i-1] && a[i]>a[i+1])
ans1++;
if(a[i+1]>a[i+2] && a[i+1]>a[i])
ans1++;
if(a[i-1]>a[i-2] && a[i-1]>a[i])
ans1++;
if(a[i-1]>a[i+1] && a[i-1]>a[i-2])
ans++;
if(a[i+1]>a[i-1] && a[i+1]>a[i+2])
ans++;
res=max(res,ans1-ans);
}
printf("%d\n",sum-res);
}
return 0;
}