直方圖中最大的矩形(單調棧經典運用)

傳送門

#include <bits/stdc++.h>

#define int long long
using namespace std;
const int MAXN = 1e5 + 10;
int a[MAXN], s[MAXN], w[MAXN], ans, p;

signed main(){
    //freopen("in", "r", stdin);
    ios::sync_with_stdio(false);
    int n;
    while (cin >> n && n){
        ans = 0, p = 0;
        for (int i = 0;i < n; i++)
            cin >> a[i];
        a[n] = 0;
        for (int i = 0;i <= n; i++){
            if (a[i] > s[p]){
                s[++p] = a[i];
                w[p] = 1;
            } else {
                int cnt = 0;
                while (s[p] > a[i]){
                    cnt += w[p];
                    ans = max(ans, cnt * s[p]);
                    p--;
                }
                s[++p] = a[i];
                w[p] = cnt + 1;
            }
        }
        cout << ans << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章