码迷,mamicode.com
首页 > 编程语言 > 详细

《算法竞赛进阶指南》0x11栈 单调栈求矩形面积 POJ2559

时间:2020-06-17 10:56:19      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:namespace   out   pac   space   top   pre   amp   判断   否则   

题目链接:http://poj.org/problem?id=2559

典型问题,就是有一个地方要注意,用数组模拟栈的时候要判断栈是否为空才能弹出元素,否则的话,设置一个st[0]=-1,这样矩形高度是0的时候就会自动判断栈空。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 100010
typedef long long ll ;
int st[maxn],h[maxn],w[maxn];
int n;
int main(){
    while(scanf("%d",&n) && n){
        int top=0;
        ll ans=0;
        for(int i=0;i<n;i++)scanf("%d",&h[i]);
        st[top]=-1;
        for(int i=0;i<n;i++){
            if(h[i]>st[top])st[++top]=h[i],w[top]=1;
            else {
                ll width=0;
                while( st[top] >= h[i]){//将所有比当前矩形高的矩形退栈,并计算最大值 
                    width+=w[top];
                    ans=max(ans,1ll*width*st[top]);
                    top--;
                }
                st[++top]=h[i],w[top]=width+1;
            }
        }
        ll width=0;
        while(top){        //最后将栈中单调的矩形退栈    
            width+=w[top];
            ans=max(ans,1ll*width*st[top]);
            top--;
        } 
        cout<<ans<<endl; 
    }
} 

 

《算法竞赛进阶指南》0x11栈 单调栈求矩形面积 POJ2559

标签:namespace   out   pac   space   top   pre   amp   判断   否则   

原文地址:https://www.cnblogs.com/randy-lo/p/13150892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!