当前位置: 代码迷 >> 综合 >> HDU 1506 Largest Rectangle in a Histogram(单调栈的经典应用)
  详细解决方案

HDU 1506 Largest Rectangle in a Histogram(单调栈的经典应用)

热度:70   发布时间:2023-11-22 00:20:29.0

题意

给定n个矩形组成的图,矩形的底都相等,高不同。从图中选一个最大的矩形并求出其面积。

解题

枚举所选取的矩形的高度为h[i]。
那么,需要求出从i向左遍历第一个比h[i]小的值的下标。以及从i向右遍历第一个比h[i]小的值的下标。
而上述功能恰恰是单调栈的经典应用。
所以,我们同时O(n)的时间复杂度求出L[i]和R[i],然后O(n)枚举h[i]即可。

AC代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;
typedef long long ll;const int maxn=1e5+7;
int h[maxn],n;int L[maxn];//L[i]表示从i向左遍历,第一个比h[i]小的值的下标
void getL()
{stack<int> S;for(int i=1;i<=n;i++)//向右遍历维护一个单调递增栈{while(S.size() && h[S.top()]>=h[i]) S.pop();L[i]=S.empty()?0:S.top();// printf("%d %d\n",i,L[i]);S.push(i);}
}int R[maxn];//R[i]表示从i向右遍历,第一个比h[i]小的值的下标
void getR()
{stack<int> S;for(int i=n;i>=1;i--)//向左遍历维护一个单调递增栈{while(S.size() && h[S.top()]>=h[i]) S.pop();R[i]=S.empty()?n+1:S.top();// printf("%d %d\n",i,R[i]);S.push(i);}
}
int main()
{while(~scanf("%d",&n),n){for(int i=1;i<=n;i++)scanf("%d",&h[i]);getL();getR();ll ans=0;for(int i=1;i<=n;i++) //枚举H=h[i]{ans=max(ans,(ll)h[i]*(R[i]-(L[i]+1)));}printf("%lld\n",ans);}return 0;
}
  相关解决方案