# HDU 1506 Largest Rectangle in a Histogram(单调栈)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20760    Accepted Submission(s): 6325

Problem Description

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.

Input

The input contains several test cases. Each test case describes a histogram and starts with an integer n, denoting the number of rectangles 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.

Output

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.

Sample Input

7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0

Sample Output

8 4000

Source

University of Ulm Local Contest 2003

Recommend

LL   |   We have carefully selected several similar problems for you:  1505 1069 1087 1058 1176

```#include<cstdio>
#define LL long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int MAXN = 100001;
LL a[MAXN];
int s[MAXN], top = 0;
int L[MAXN], R[MAXN];
void clear() {top = 0;}
int main() {
//#ifdef WIN32
//freopen("a.in", "r", stdin);
//#endif
int N;
while(~scanf("%d", &N) && N != 0) {
clear();
s[0] = 0;
for(int i = 1; i <= N; i++) scanf("%I64d",&a[i]);
for(int i = 1; i <= N; i++) {
while(top > 0 && a[i] <= a[ s[top] ]) top--;
L[i] = min(s[top] + 1, i);
s[++top] = i;
}
clear();
s[0] = N + 1;
for(int i = N; i >= 1; i--) {
while(top > 0 && a[i] <= a[ s[top] ]) top--;
R[i] = max(s[top] - 1, i);
s[++top] = i;
}
LL Ans = 0;
for(int i = 1; i <= N; i++)
Ans = max(Ans, (R[i] - L[i] + 1) * a[i] );
printf("%I64d\n",Ans);
}
return 0;
}```

0 条评论

• ### HDU 3032 Nim or not Nim?(Multi-Nim)

Problem Description Nim is a two-player mathematic game of strategy in which ...

• ### P3507 [POI2010]GRA-The Minima Game

题目描述 Alice and Bob learned the minima game, which they like very much, recently....

• ### POJ 3461 kmp

Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40168 ...

• ### 周练19.11.03/10

它表示一个迷宫，其中的1表示墙壁，0表示可以走的路，只能横着走或竖着走，不能斜着走，要求编程序找出从左上角到右下角的最短路线。

• ### ZOJ 3705 Applications

Recently, the ACM/ICPC team of Marjar University decided to choose some new memb...

• ### Directly applying Bayesian ridge regression直接使用贝叶斯岭回归

In the Using ridge regression to overcome linear regression's shortfalls recipe,...

• ### 【CodeForces 596A】E - 特别水的题5-Wilbur and Swimming Pool

After making bad dives into swimming pools, Wilbur wants to build a swimming poo...

• ### Codeforces Beta Round #1 A,B,C

A. Theatre Square time limit per test:1 second memory limit per test:256 megabyt...

• ### hdu 2473 Junk-Mail Filter (并查集之点的删除)

Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/...

• ### HDUOJ----（1031）Design T-Shirt

Design T-Shirt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327...