最大長方形

最大長方形(二)

時間限制:1000 ms  |  內存限制:65535 KB
難度:4
描述

Largest Rectangle in a Histogram

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles: 


Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.
輸入
The input contains several test cases. Each test case describes a histogram and starts with an integer n, denoting the number of rectles it is composed of. You may assume that 1 <= n <= 100000. Then follow n integers h1, ..., hn, where 0 <= hi <= 1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is 1. A zero follows the input for the last test case.
輸出
For each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.
樣例輸入
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
樣例輸出
8
4000
個人理解:考慮用單調隊列的思路,先將所有高度的數據存入棧中,逐次進行比較,如果後面的數據小於前面的,將前面的數據壓出棧中,並將對應的長度與單調匹配的高度與之相乘得到相應的面積,然後按照上面的思路將壓出棧的面積比較,取最大面積進行輸出處理。

#include<cstdio>
#include<iostream>
using namespace std;
int stack[100010]={-2},len[100010];
long long ans;
int main() {
	int n,top,h;
	while(scanf("%d",&n), n) {
		top=0;ans=0;
		for(int i=0;i<=n;i++) {
			if(i<n)scanf("%d",&h);
			else h=-1;
			if(h > stack[top]) {
				stack[++top]=h;
				len[top]=1;
			} else {
				int l = 0;
				while(stack[top] >= h) {
					ans=max(ans,(long long)(l+len[top])*stack[top]);
					l += len[top--];
				}
				stack[++top] = h;
				len[top] = l + 1;
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章