解法:对某一位置,求左右的最大值,当满足len[i]<left[i-1]&&len[i]<right[i+1]时,即可得到一个凹槽,那么依次遍历,加和即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=5e4+5;
int len[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&len[i]);
//找凹槽
int left[maxn],right[maxn];
for(int i=0;i<n;i++)
{
if(i==0) {
left[i]=len[i];
right[n-i-1]=len[n-i-1];
continue;
}
left[i]=max(left[i-1],len[i]);
right[n-i-1]=max(right[n-i],len[n-i-1]);
}
LL sum=0;
for(int i=1;i<n-1;i++)
{
if( len[i] < left[i-1] && len[i] <right[i+1] ) {
sum+=1l*min(left[i-1],right[i+1])-len[i];
}
}
cout<<sum<<endl;
return 0;
}