poj2599 单调栈维护最大连续矩形面积

  这个题就是给你一串连续的矩形, 每个矩形的宽度为1, 高度给定, 选定连续的一串矩形, 其高度是所有矩形高度中的最小值,宽度为选定的, 问怎么选能使矩形的面积最大?我们以一个矩形为中心,并设这个矩形的高度最小, 分别向两边延生, 那么此时的最大面积就是a[i] * (R[i]-l[i]+1), 代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;
typedef long long LL;
int n;
int a[100000+100];
int st[100000+100], top;
int L[100000+100], R[100000+100];

int main(){
    while(scanf("%d", &n) == 1){
        if(n == 0) break;
        for(int i=0; i<n; i++) scanf("%d", &a[i]);
        top = 0;
        //计算最左边的
        for(int i=0; i<n; i++){
            while(top>0 && a[st[top-1]]>=a[i]) top--;
            L[i] = top==0?0:st[top-1]+1;
            st[top++] = i;
        }
        //计算最右边的
        top = 0;
        for(int i=n-1; i>=0; i--){
            while(top>0 && a[st[top-1]]>=a[i]) top--;
            R[i] = top==0?n-1:st[top-1]-1;
            st[top++] = i;
        }
//        for(int i=0; i<n; i++)
//            printf("%d%c", L[i], i==n-1?'\n':' ');
//        for(int i=0; i<n; i++)
//            printf("%d%c", R[i], i==n-1?'\n':' ');
        LL area = 0;
        for(int i=0; i<n; i++){
            area = max(area, (LL)a[i]*(R[i]-L[i]+1));
        }
        cout<<area<<endl;
    }
    return 0;
}

 

posted @ 2016-03-16 16:28  xing-xing  阅读(391)  评论(0编辑  收藏  举报