首页 > 其他 > 详细

单调栈(两边扩展)

时间:2020-02-12 19:41:02      阅读:72      评论:0      收藏:0      [点我收藏+]

http://acm.hdu.edu.cn/showproblem.php?pid=1506

题意:给出连续的一组宽度为1,高为a[i]的长方形 , 问整个图所能构成的面积最大的长方形。

解法:单调递增栈记录以每一个值为最小值的两边扩展的最大值。比较以每一个值为最小值组成长方形面积的最大值。

#include <bits/stdc++.h>
#define ME(x , y) memset(x , y , sizeof(x))
#define SC scanf
#define rep(i ,j , n) for(int i = j ; i < n ; i ++)
#define red(i , n , j) for(int i = n-1 ; i >= j ; i--)
#define INF  0x3f3f3f3f
#define mod 998244353
#define PI acos(-1)
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
using namespace std;
typedef long long ll ;
const int MX = 1e5+9;
ll val[100009] , len[100009] ;//每一个元素和该元素的两边扩展额长度
ll s[100009] ,top ;//单调递减栈:记录每一个值向两边扩展的长度

 int main() {

     ll n ;
     while(cin >> n&&n){
        rep(i , 1 , n+1){
            scanf("%lld" , &val[i]);
            len[i] = 1 ;
        }
        val[n+1] = -1 , len[n+1] = 0 ;
        ll temp = 0 , ma = -1 , top = 0;
        rep(i , 1 , n+2){
            while(top && val[s[top-1]] >= val[i]){
                len[s[top-1]] += temp;//加上上一个弹栈的扩展长度(向右扩展长度)
                temp = len[s[top-1]];//记录该扩展长度
                ma = max(ma , len[s[top-1]] * val[s[top-1]]);
                top--;
            }
            len[i] += temp;(向左扩展长度)
            temp = 0;
            s[top++] = i ;
        }
        cout << ma << endl;
     }
 }

 

单调栈(两边扩展)

原文:https://www.cnblogs.com/nonames/p/12300035.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!