题目
思路
这道题真的离谱
用单调栈和尺取法写了一个上午发现有个无法解决的bug。
然后突然发现这个就是一个降智题。
逐位考虑每一个柱子,如果该柱子上方有水,
那其高度一定
min
(
左
最
大
值
,
右
边
最
大
值
)
−
a
[
i
]
\min(左最大值,右边最大值)-a[i]
min(左最大值,右边最大值)−a[i]。然后叠加即可。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int r[3000010],l[3000010];
int n,a[3000010],ans;
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=1; i<=n; i++)
l[i]=max(l[i-1],a[i]);
for(int i=n; i>=1; i--)
r[i]=max(a[i],r[i+1]);
for(int i=1; i<=n; i++)
ans+=min(l[i],r[i])-a[i];
printf("%d",ans);
return 0;
}