POJ2559 最大矩形面积

POJ2559 最大矩形面积

题意

给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。

输入格式

第一行一个数

第二行有 个整数,分别表示每个建筑物高度 。

输出格式

一个整数,表示海报的最大面积。

样例

样例输入

6
5 8 4 4 8 4

样例输出

24

思路

用一个单调递增栈记录每个矩形向右延伸的最大距离, 比如样例:

1.拿到一个ai, 判断他是否大于栈顶,是则直接入栈, 否则把比他大的元素全部出栈, 以维持单调性.出栈元素的个数即为延伸长度.

#include <cstdio>
#include <algorithm>
using namespace std;
int a[1000010], b[1000010], pos[1000010], top, ans, n;
signed main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n + 1 ;i++){
        if(a[i] > b[top]) b[++top] = a[i], pos[top] = 1;//大于栈顶元素,直接入栈
        else {//小于栈顶元素 
            int len = 0;//延伸长度 
            while(b[top] > a[i]){//维持栈的单调性
                len += pos[top];//记录延伸长度, 最终得到的值相当于下标做差
                ans = max(ans, len * b[top]);//面积=延伸的长度*这段长度内最低矩形的高度
                top--;
            }
            b[++top] = a[i];
            pos[top] = len + 1;//pos[top]表示top向后延伸的最大长度
        }
    }
    printf("%d
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/hzoi-poozhai/p/12838958.html