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