poj--2559 Largest Rectangle in a Histogram(单调栈)

poj 2559

题解

对于每个矩形,左右扫描一下找到第一个比其高度更小的矩形。

维护一个单调递增栈,即从栈底到栈顶严格递增,这样,栈顶就是第一个更小的值。
维护两个数组,L[i] 和 R[i] 分别表示第 i 个矩形的这两个下标。

#include 
#include 
#include 
using namespace std;

typedef long long ll;
const int maxn = 100000 + 10;
int   n;
int   h[maxn];
int   L[maxn], R[maxn], stack[maxn];

void solve()
{
    int k = 0;
    for(int i = 0; i < n; ++i){
        while(k > 0 && h[stack[k - 1]] >= h[i]) --k;
        L[i] = (k == 0 ? 0 : stack[k - 1] + 1);
        stack[k++] = i;
    }

    k = 0;
    for(int i = n - 1; i >= 0; --i){
        while(k > 0 && h[stack[k - 1]] >= h[i]) --k;
        R[i] = (k == 0 ? n : stack[k - 1]);
        stack[k++] = i;
    }

    ll ans = 0;
    for(int i = 0; i < n; ++i){
        //printf("L:%d   R:%d   T:%d\n", L[i], R[i], h[i] * (R[i] - L[i]));
        ans = max(ans, (ll)h[i] * (R[i] - L[i]));
    }
    printf("%I64d\n", ans);
}


int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
    while(cin >> n && n){
        for(int i = 0; i < n; ++i) scanf("%d", h + i);
            solve();
    }

    return 0;
}

你可能感兴趣的:(数据结构,数据结构--单调栈)