1. 程式人生 >實用技巧 >其它 >AcWing 131. 直方圖中最大的矩形(單調棧)

AcWing 131. 直方圖中最大的矩形(單調棧)


題目連結

直方圖是由在公共基線處對齊的一系列矩形組成的多邊形。

矩形具有相等的寬度,但可以具有不同的高度。

例如,圖例左側顯示了由高度為 2,1,4,5,1,3,3 的矩形組成的直方圖,矩形的寬度都為 1:

AcWing 131. 直方圖中最大的矩形(單調棧)

通常,直方圖用於表示離散分佈,例如,文字中字元的頻率。

現在,請你計算在公共基線處對齊的直方圖中最大矩形的面積。

圖例右圖顯示了所描繪直方圖的最大對齊矩形。

輸入格式

輸入包含幾個測試用例。

每個測試用例佔據一行,用以描述一個直方圖,並以整數 n 開始,表示組成直方圖的矩形數目。

然後跟隨 n 個整數 h1,…,hn。

這些數字以從左到右的順序表示直方圖的各個矩形的高度。

每個矩形的寬度為 1。

同行數字用空格隔開。

當輸入用例為 n=0 時,結束輸入,且該用例不用考慮。

輸出格式

對於每一個測試用例,輸出一個整數,代表指定直方圖中最大矩形的區域面積。

每個資料佔一行。

請注意,此矩形必須在公共基線處對齊。

資料範圍

1≤n≤100000,
0≤hi≤1000000000

輸入樣例:

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

輸出樣例:

8
4000

答案:

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e5 + 10;
const int M = 1111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;

int hp[N];
int l[N];
int r[N];
int dp[N];

void solve(){
    int n;
    while(cin>>n){
        if(!n) break;
        rep(i,1,n) cin>>hp[i];
        hp[0]=hp[n+1]=-1;

        //求左邊界
        int temp=0;
        dp[0]=0;
        rep(i,1,n){
            while(hp[dp[temp]]>=hp[i]) temp--;
            l[i]=dp[temp];
            dp[++temp]=i;
        }

        //求右邊界
        temp=0;
        dp[0]=n+1;
        for(int i=n;i;i--){
            while(hp[dp[temp]]>=hp[i]) temp--;
            r[i]=dp[temp];
            dp[++temp]=i;
        }
        ll ans=0;
        rep(i,1,n){
            ans=max(ans,(ll)hp[i]*(r[i]-l[i]-1));
        }
        cout<<ans<<endl;
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
	return 0;
}