突破口:递增序列从前往后给糖,递减序列从后往前给糖,由于某个递增序列结尾与后面的递减序列的开头相同,这个时候发给这个同学的糖的数量就会有两个,为了满足要求,这时候要给两者之间最大的那个数量。
设置两个数组,分别记录递增与递减序列分发的糖数。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e+5;
ll a[maxn],b[maxn],c[maxn];
int main()
{
int T,n,i,j;
ll sum;
cin>>T;
while(T--)
{
cin>>n;
for(i=0;i<=n-1;i++)
cin>>a[i];
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
sum=0;
for(i=1;i<=n-1;i++)
if(a[i]>a[i-1])
b[i]=b[i-1]+1;
else if(a[i]==a[i-1])
b[i]=b[i-1];
for(i=n-2;i>=0;i--)
if(a[i]>a[i+1])
c[i]=c[i+1]+1;
else if(a[i]==a[i+1])
c[i]=c[i+1];
/* for(i=0;i<=n-1;i++)
cout<<i+1<<' ';cout<<endl;
for(i=0;i<=n-1;i++)
cout<<b[i]<<' ';cout<<endl;
for(i=0;i<=n-1;i++)
cout<<c[i]<<' ';cout<<endl;*/
for(i=0;i<=n-1;i++)
sum+=max(b[i],c[i]);
cout<<sum<<endl;
}
}