洛谷 P1318 積水面積(單調棧)

傳送門


解題思路

其實很簡單的一個單調棧就可以解決的題,題解裏的做法都寫的很麻煩。

建立一個強制不爲空的單調遞減棧,然後運用掃描線的思想可以快速求出面積。

強制不爲空是爲了保證最左端一定要有柱子。單調遞減是因爲受到影響某個區域能否存儲水的是左面和右面最高的柱子中的最小值。

可以藉助下圖進行理解:
image

分開區域進行計算即可。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章