分析
对于一个格子的贡献,就是左右边第一个比他高的减去它。
所以从左往右取一遍最大值,右往左取一遍最大值,再取两个最大值的最小值,就可以
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100001],s[100001],mx,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
mx=max(mx,a[i]);
s[i]=mx;
}
mx=0;
for(int i=n;i>=1;i--)
{
mx=max(mx,a[i]);
s[i]=min(s[i],mx);
}
for(int i=1;i<=n;i++)
{
ans+=s[i]-a[i];
}
cout<<ans;
return 0;
}