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

# include <cstdio>
# include <iostream>
# include <set>
# include <map>
# include <vector>
# include <list>
# include <queue>
# include <stack>
# include <cstring>
# include <string>
# include <cstdlib>
# include <cmath>
# include <algorithm>

# define ll long long
using namespace std ;

struct HEHE
{
    ll len , h ;
} ;

stack < HEHE > st ;

int main ( )
{
    cin . sync_with_stdio ( false ) ;
    int n ;
    st . push ( HEHE { 1 , 0 } ) ;
    while ( cin >> n , n )
    {
        st . top ( ) . len = 1 ;
        ll ans = 0 ;
        while ( n -- )
        {
            HEHE a ;
            cin >> a . h ;
            a . len = 1 ;
            while ( st . size ( ) > 1 && st . top ( ) . h > a . h )
            {
                HEHE t = st . top ( ) ;
                st . pop ( ) ;
                st . top ( ) . len += t . len ;
                ans = max ( ans , ( st . top ( ) . len - 1 ) * t . h ) ;
            }
            st . push ( a ) ;
        }
        while ( st . size ( ) > 1 )
        {
            HEHE t = st . top ( ) ;
            st . pop ( ) ;
            st . top ( ) . len += t . len ;
            ans = max ( ans , ( st . top ( ) . len - 1 ) * t . h ) ;
        }
        cout << ans << endl ;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值