POJ 2082-Terrible Sets(スタック)

1305 ワード

n個の連続した長方形を与え、それらの底辺の幅と高さを与えます。最大の長方形の面積を求めます。
分析:POJ 2559と同じ原理です。コンベヤー?ドアhttp://blog.csdn.net/hhhhhhj123/article/details/47790801。ただPOJ 2559の底幅は全部1です。この問題は違います。だからコードがちょっと違っています。
コード:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 55555;

int w[maxn], h[maxn];
int L[maxn], R[maxn];
int st[maxn];
int n;

int main() {
    while(scanf("%d", &n) && n != -1) {
        for(int i = 0; i < n; i++)
            scanf("%d%d", &w[i], &h[i]);
        memset(st, 0, sizeof(st));
        int t = 0;
        for(int i = 0; i < n; i++) {
            while(t > 0 && h[st[t-1]] >= h[i]) t--;
            L[i] = t == 0 ? 0 : (st[t-1]+1);
            st[t++] = i;
        }
        t = 0;
        for(int i = n-1; i >= 0; i--) {
            while(t > 0 && h[st[t-1]] >= h[i]) t--;
            R[i] = t == 0 ? n-1 : (st[t-1]-1);
            st[t++] = i;
        }
        int ans = 0;
        for(int i = 0; i < n; i++) {
            int len = 0;
            for(int j = L[i]; j <= R[i]; j++)
                len += w[j];
            ans = max(ans, h[i]*len);
        }
        printf("%d
", ans); } return 0; }