专栏首页数据结构与算法HDU 1506 Largest Rectangle in a Histogram(单调栈)

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

一道挺裸的单调栈

我们预处理出每一个位置向左/向右第一个比他小的位置

然后统计答案,这样很显然是对的

时间复杂度$O(N)$

#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 ...

    attack
  • P3507 [POI2010]GRA-The Minima Game

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

    attack
  • POJ 3461 kmp

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

    attack
  • 周练19.11.03/10

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

    AngelNH
  • ZOJ 3705 Applications

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

    ShenduCC
  • 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...

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

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

    Gxjun
  • HDUOJ----(1031)Design T-Shirt

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

    Gxjun

扫码关注云+社区

领取腾讯云代金券