poj2559单调栈

给一系列并排的矩形,宽都是1,长不同,求最大的矩形(可被上述矩形覆盖)的面积

单调栈,栈中元素为每个值所在的位置,记录下从每个值大于当前值所能到达最远的左边和右边的距离,此时中间的值一定是最小,然后H*(R-L)即当前点所能覆盖的最大面积

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-9;
const int N=100000+10,maxn=5000+10,inf=0x3f3f3f3f;

ll q[N],a[N],l[N],r[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    while(cin>>n,n){
        ll t=0;
        for(int i=0;i<n;i++)cin>>a[i];
        for(int i=0;i<n;i++)
        {
            while(t>0&&a[i]<=a[q[t-1]])t--;
            if(t>0)l[i]=q[t-1]+1;
            else l[i]=0;
            q[t++]=i;
        }
        t=0;
        for(int i=n-1;i>=0;i--)
        {
            while(t>0&&a[i]<=a[q[t-1]])t--;
            if(t>0)r[i]=q[t-1];
            else r[i]=n;
            q[t++]=i;
 //           cout<<r[i]<<endl;
        }
        ll ans=0;
        for(int i=0;i<n;i++)
            ans=max(ans,a[i]*(r[i]-l[i]));
        cout<<ans<<endl;
      //  cout<<ans<<endl;
    }
    return 0;
}

时间: 2024-11-03 20:49:45

poj2559单调栈的相关文章

POJ2559 单调栈

http://poj.org/problem?id=2559 题意都懂,给出数列h1,h2,...hn.代表n个宽为1,高为hi的矩形,求最大连续的矩形面积. 思路:对于每个矩形,当然高已经决定,我们思考它的宽可以为多少.很容易得出它的宽可以向左右延伸到第一个高小于它的矩形之前.也就是说,对于每个hi,找到其左右两边最接近且小于它的数的序号l,r,它的宽就是r-l-1,当然面积就是hi*(ri-li-1),取n个中的最大值当然就是答案了. 使用单调栈算法,我们可以在O(N)的时间复杂度下求出hi

(单调栈)poj-2559 Largest Rectangle in a Histogram

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

POJ2559 Largest Rectangle in a Histogram(单调栈)

题目给一个由几个相连接的矩形组成的多边形,计算多边形包含的最大的矩形的面积. 要求的矩形的高一定是某一个用来组合的矩形的高:如果枚举每个矩形作为高的话,那样长就是这个矩形能向左向右继续延伸矩形的长度了. 所以这题本质也是用单调栈在O(n)计算出每个数作为最小数向左和向右能延伸的最长距离. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define MAXN 111111 5 int a[MAXN

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

Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22171   Accepted: 7173 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal wi

2014湘潭邀请赛 C题 湘大OJ 1205 Range (单调栈)

Problem Description For an array, the range function is defined below: Range(A)=Max(A)-Min(A)+1; For example, suppose A={1,2,3,4,5}, then Range(A)=5-1+1=5. Now, given an array A(length≤100000), you are going to calcalute the sum of all subarray's ran

poj 2059 单调栈

题意:求柱状图中最大矩形面积. 单调栈:顾名思义就是栈内元素单调递增的栈. 每次插入数据来维护这个栈,假设当前须要插入的数据小于栈顶的元素,那就一直弹出栈顶的元素.直到满足当前须要插入的元素大于栈顶元素为止.能够easy求出某个数左边或右边,第一个大于或小于它的数,且复杂度是O(n). 思路:easy先想到一个好的枚举方式:以当前柱状为扩展点,往左边和右边扩展.当遇到一个比当前柱状小的柱状时停止扩展.以当前柱状的高度为矩形的高.向左右扩展的距离之差为矩形的长度,这样对n个柱状进行扫描之后可得最大

单调栈练习题题解

单调栈 单调栈顾名思义就是让栈中的元素是单调的,要么递增,要么递减.同样它也满足栈的性质,先进后出. 单调递增栈,则从栈顶到栈底的元素是严格递增的 单调递减栈,则从栈顶到栈底的元素是严格递减的 练习题 单调栈 练习题 POJ3250 POJ2796 BZOJ1113 HDU1506 POJ2559 JDFZ2997 POJ3250 POJ3250传送门 对于每一个牛来说,能看到的数目为向右数身高比它小的个数,累加就是答案. 所以可以倒着维护一个单调递增的栈,记录i之前的弹栈数目,累加. (正着也

[数据结构]单调栈的基本应用2

[数据结构]单调栈的基本应用2 一.前言 单调栈的基本应用2是单调栈的基本应用1的延伸.应用2主要解决的是二维平面的一些问题. 二.基本应用2 虽然已经应用到二维平面,但是单调栈的思想并没有变化 更多应用的是延伸的位置.本质是ai的左/右第一个大于ai的元素位置 下面列举的一些平面内单调栈的例题: 例1: POJ2559 最大矩形面积 题目描述: 给定n个依次排列并且面积为1*hi的矩形,现求这个图形所包含最大的矩形的面积. 上图中7个矩形的h依次为2 1 4 5 1 3 3.注意题目有多组数据

【单调栈】hdu1506 Largest Rectangle in a Histogram

单调栈的介绍及一些基本性质 http://blog.csdn.net/liujian20150808/article/details/50752861 依次把矩形塞进单调栈,保持其单增,矩形中的元素是一个三元组,存储其位置,高度,以及以其为高度的情况下,大矩形的左边界最多扩展到哪里. 每次将新的元素塞进栈的时候,其左边界就是其左侧第一个小于它的矩形的位置+1. 然后,每个矩形出栈的时候,记录其右边界为当前往栈里面塞的矩形的位置-1,然后更新答案即可. 注意最后把所有的矩形出栈,更新答案. #in