题目描述
PIPI又来考察大家序列处理能力啦。
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
输入
第一行给出一个整数n,表示柱子的个数。 n<=1e5.
接下来给出n个整数,表示n根柱子的高度,都不超过50000.
输出
输出一共能接住多少雨水。
样例输入
12
0 1 0 2 1 0 1 3 2 1 2 1
样例输出
6
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int main(){
stack<int> s;
int n;
long long ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(s.empty()||a[s.top()]>=a[i]){
s.push(i);
}else{
while(!s.empty()&&a[s.top()]<a[i]){
int id=s.top();s.pop();
if(s.empty())
break;
int d=i-s.top()-1,h=min(a[i],a[s.top()])-a[id];
ans+=1ll*d*h;
}
s.push(i);
}
}
printf("%lld",ans);
}