题目大意

  有一个直方图,其所有矩形的底均是1(以后简称小矩形)。给出这些矩形的高度,求这些矩形的并集中存在的面积最大的矩形(简称大矩形)的面积。

题解

  大矩形的高必然一边等于一个小矩形的高,另一边小于等于另一个小矩形的高。

  我们现考虑面积最大矩形左边高等于其所在小矩形的高的情况,则其右边高小于等于其对应的小矩形的高(以后将此简称为左等高矩形)。我们要维护一个单调栈,使得栈里的矩形的高度都是单调递增的。一个一个枚举小矩形,如果当前小矩形高度比栈顶的矩形高度高或等,则如果所求大矩形是个左边为栈内矩形的左等高矩形,则这条小矩形就必然位于这个大矩形的右边所在小矩形的位置及左侧(性质1)(因为宽度越宽越好)。将此小矩形推入栈中。此情况一直延续到当前小矩形比站定的矩形高度低时。此时如果把此小矩形推入栈内,栈就不满足性质1了。因此这时便是开始利用性质1结算(当前小矩形左方的)左等高矩形的时刻了(小矩形高度乘以到当前小矩形的宽度)。

  那么右等高矩形呢?右等高矩形相当于将该大矩形以上部分的小矩形削掉以后的左等高矩形。因此当遇到上述的第二种情况时,当栈顶矩形高度小于当前小矩形高度时,退出,然后将宽度为累加值,高度为当前小矩形高度的矩形推入栈内即可。注意最后要增加一个高度为0的小矩形,来应对大矩形右边为最右一个小矩形的情况。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std; const int MAX_N = 100010;
int A[MAX_N]; struct Rect
{
int Height, Width; Rect(int height, int width):Height(height),Width(width){}
};
stack<Rect> St; int main()
{
int n;
while (scanf("%d", &n) && n)
{
for (int i = 1; i <= n; i++)
scanf("%d", A + i);
long long ans = 0;
A[++n] = 0;
St.push(Rect(A[1], 1));
for (int i = 2; i <= n; i++)
{
if (A[i] >= St.top().Height)
St.push(Rect(A[i], 1));
else
{
long long width = 0;
while (!St.empty() && St.top().Height >= A[i])
{
ans = max(ans, (long long)St.top().Height * (width+=St.top().Width));
St.pop();
}
St.push(Rect(A[i], width + 1));
}
}
printf("%lld\n", ans);
}
return 0;
}

  

POJ2559 Largest Rectangle in a Histogram 单调栈的更多相关文章

  1. POJ2559 Largest Rectangle in a Histogram —— 单调栈

    题目链接:http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Lim ...

  2. poj 2559 Largest Rectangle in a Histogram - 单调栈

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19782 ...

  3. POJ 2559 Largest Rectangle in a Histogram(单调栈)

    传送门 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  4. POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15831 ...

  5. hdu 1506 Largest Rectangle in a Histogram(单调栈)

                                                                                                       L ...

  6. po'j2559 Largest Rectangle in a Histogram 单调栈(递增)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29498 ...

  7. HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)

    题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...

  8. PKU 2559 Largest Rectangle in a Histogram(单调栈)

    题目大意:原题链接 一排紧密相连的矩形,求能构成的最大矩形面积. 为了防止栈为空,所以提前加入元素(-1,0) #include<cstdio> #include<stack> ...

  9. Largest Rectangle in a Histogram /// 单调栈 oj23906

    题目大意: 输入n,,1 ≤ n ≤ 100000,接下来n个数为每列的高度h ,0 ≤ hi ≤ 1000000000 求得最大矩阵的面积 Sample Input 7 2 1 4 5 1 3 34 ...

随机推荐

  1. Laravel5.1学习笔记16 数据库2 查询构造器(这个不用看,不如用EloquentORM)

    Introduction Retrieving Results Aggregates Selects Joins Unions Where Clauses Advanced Where Clauses ...

  2. [ JSOI 2015 ] Salesman

    \(\\\) \(Description\) 给出一棵以\(1\)为根的\(N\)个节点的树,开始的时候你在\(1\)号节点. 除了\(1\)号节点以外,每个点都有访问次数限制\(t_i\),即到达该 ...

  3. 【PostgreSQL-9.6.3】触发器概述(普通触发器)

    一个触发器声明了当执行一种特定类型的操作时数据库应该自动执行一个特殊的函数.触发器可以被附加到表.视图和外部表.触发器经常用于做完整性约束,或者某种业务规则的约束. 1. 触发器的创建语法如下: CR ...

  4. html5——web字体

    基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...

  5. css的基本单词

    <border>边框 border边框 <text>文本 text文本 <indent>缩进 indent缩进 <align>对齐方式 align对齐方 ...

  6. C 语言常用方法技巧

    C语言常用方法技巧 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impor ...

  7. ionic下拉多项选择

    1.npm install ion-multi-picker --save 2.引入 import { MultiPickerModule } from 'ion-multi-picker'; imp ...

  8. 什么是ACID

    ACID是衡量事务的四个特性: 原子性(Atomicity,或称不可分割性) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 原子性:原子性是指一个事务 ...

  9. 4.Linux的进程

    4.1 Linux的进程 4.1.1 进程的概述 有关进程的一些基本概念: 1.什么是进程: 当程序被触发后,执行者的权限与属性.程序的程序代码与所需的数据都会被加载到内存中,操作系统并给予这个内存内 ...

  10. node.js 中的package.json文件怎么创建?

    最近在用webstorm和nodejs做一些东西,老是各种混乱,今天上午创建一个新的项目,结果发现,npm init之后,并没有出现package.json,并没有太明确他的功能的小姑娘表示十分的惊慌 ...