博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1506
阅读量:4357 次
发布时间:2019-06-07

本文共 2131 字,大约阅读时间需要 7 分钟。

 

Largest Rectangle in a Histogram

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 5335    Accepted Submission(s): 1523

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

 

 

#include<iostream>

using namespace std;
int
n,i,a[100010],b[100010],c[100010];
long long
sum,m;
int
main()
{
    c[0]=-1;
    while
(scanf("%d",&n)!=EOF&&n>0)
    {
        for
(i=1;i<=n;i++)
        {
            scanf("%d",&c[i]);
            a[i]=i;
            b[i]=i;
        }
        c[n+1]=-0x7fffffff;
        for
(i=1;i<=n;i++)
        {
            while
(c[a[i]-1]>=c[i])
                a[i]=a[a[i]-1];
        }
        for
(i=n;i>=1;i--)
        {
            while
(c[b[i]+1]>=c[i])
                b[i]=b[b[i]+1];
        }
        sum=-1;
        for
(i=1;i<=n;i++)
        {
            m=b[i]-a[i]+1;
            m=m*c[i];
            if
(m>sum) sum=m;
        }
        printf("%I64d\n",sum);
    }
    return
0;
}

转载于:https://www.cnblogs.com/hduacm/archive/2012/08/04/2623375.html

你可能感兴趣的文章
001---进程
查看>>
视频人脸检测——OpenCV版(三)
查看>>
php获取来访者在搜索引擎搜索某个关键词,进入网站
查看>>
物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
查看>>
2018-2019-1 20165234 20165236 实验二 固件程序设计
查看>>
IDEA的GUI连接数据库写入SQL语句的问题总结
查看>>
Xpath在选择器中正确,在代码中返回的是空列表问题
查看>>
leecode第一百九十八题(打家劫舍)
查看>>
【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
查看>>
07-3. 数素数 (20)
查看>>
写一个欢迎页node统计接口Py脚本(邮件,附件)-py
查看>>
计算两个日期之间的天数
查看>>
Android关于buildToolVersion与CompileSdkVersion的区别
查看>>
袋鼠云日志,日志分析没那么容易
查看>>
缓存穿透 缓存雪崩 缓存并发
查看>>
了解你的Linux系统:必须掌握的20个命令
查看>>
js setInterval 启用&停止
查看>>
knockoutJS学习笔记04:监控属性
查看>>
Linux下启动/关闭Oracle
查看>>
session和cookie的区别
查看>>