傳送門
解題思路
其實很簡單的一個單調棧就可以解決的題,題解裏的做法都寫的很麻煩。
建立一個強制不爲空的單調遞減棧,然後運用掃描線的思想可以快速求出面積。
強制不爲空是爲了保證最左端一定要有柱子。單調遞減是因爲受到影響某個區域能否存儲水的是左面和右面最高的柱子中的最小值。
可以藉助下圖進行理解:
分開區域進行計算即可。
AC代碼
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=1e4+5;
int n,a[maxn],ans;
stack<int> q;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n-1;i++){//單調遞減棧,且不爲空。
while(!q.empty()&&a[q.top()]<a[i]){
int last=q.top();
q.pop();
if(!q.empty()) ans+=(min(a[q.top()],a[i])-a[last])*(i-q.top()-1);
}
q.push(i);
}
cout<<ans;
return 0;
}