POJ 2559 题解 最大矩形面积 单调栈
2017-09-14 22:09
323 查看
【题目描述】:
地面上从左到右并排紧挨着摆放多个矩形,已知这此矩形的底边宽度都为1,高度不完全相等。求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。如 n = 7, 序列为2 1 4 5 1 3 3
口 口 口口 回回 口口 口口 回回 口口 口 口口 口口 口 回回 口口 口口口口口口口 口口回回口口口
最大面积:8
【输入描述】:
输入有多组数据,每组数据一行:第一个数N,表示矩形个数
后面跟N个正整数,第i个正整数hi表示第i个矩形的高度。
最后一行,以一个单独的0结束。
【输出描述】:
每组输入数据一行,一个数表示最大矩形面积。
【样例输入】:
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
【样例输出】:
8 4000
【时间限制、数据范围及描述】:
时间:1s 空间:64M30 %: 1<=N<=100
60 %: 1<=N<=1,000
100%: 1<=N<=500,000,0<=hi<=1,000,000,000
解题思路:
这题数据范围是1<=N<=500,000,0<=hi<=1,000,000,000,又是多组数据,所以我们几乎只能考虑O(N)算法。题目要求找最大矩形的面积,那么就等价于对于每个统计图高度,找到他左边第一个比他小的位置和右边第一个比他小的位置即可。那么跑一边单调栈即可解决问题。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; int n,a[500005],l[500005],r[500005]; int st[500005],tp; ll mx(ll x,ll y){ return x>y?x:y; } void work(){ ll maxn=0; tp=0; memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ while(tp>0&&a[st[tp]]>a[i]){ r[st[tp]]=i; tp--; } l[i]=st[tp]+1; tp++; st[tp]=i; } for(int i=1;i<=n;i++){ if(r[i]==0)r[i]=n+1; maxn=mx(maxn,(ll)((ll)(r[i]-l[i])*(ll)a[i])); } printf("%lld\n",maxn); } int main(){ while(1){ scanf("%d",&n); if(n==0)break; work(); } return 0; }
相关文章推荐
- Poj 2559 最大矩形面积 v单调栈 分类: Brush Mode 2014-11-13 20:48 81人阅读 评论(0) 收藏
- Poj 2559 最大矩形面积 v单调栈
- Poj 2559 最大矩形面积
- POJ 2559 最大矩形面积 poj 3494
- 连续区域最大矩形面积 POJ 1964 2082 2559 2796 3250 3494
- POJ 2559 Largest Rectangle in a Histogram(单调栈维护最大矩形面积)
- poj 2559 Largest Rectangle in a Histogram 求面积最大的矩形(单调栈)
- Poj 2559 最大矩形面积
- Poj 2559 Largest Rectangle in a Histogram(柱形统计图中的最大矩形面积)
- poj 2559 求连续的最大矩形面积(也可用于ccf最大连续矩形面积)
- POJ 2559最大矩形面积
- poj2559(单调栈)最大矩形面积
- 单调栈:柱形统计图中最大面积(POJ 2559)
- 9715 相邻最大矩形面积 单调栈
- poj 1964 DP 求最大子矩形面积
- hdu 1505 City Game 最大矩形面积 单调队列
- 单调栈:柱形统计图中最大面积(POJ 2559)
- 【POJ 1964】求10图矩形最大面积
- poj3494 连续区域最大矩形面积 我要做的足够 强大
- POJ 2082 Terrible Sets 51nod 1102 面积最大的矩形 《题意好难懂---<贪心+单调栈>》