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