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;
}