2559 Largest Rectangle in a Histogram
阿新 • • 發佈:2019-02-08
Step1 Problem:
給你n個連續的寬為1的長方形,高為a[i]。
裡面包含的長方形最大的面積是多少?
資料範圍:
1<=n<=1e5, 0 <= a[i] <= 1e9.
例子:
Input:
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
Output:
8
4000
Step2 Ideas
對於每個i, 我們只需要 求出 左邊高度第一個比它小的下標L[i] 和 右邊高度第一個比它小的下標R[i]。
第i個長方形為高,面積為a[i] * (R[i] - L[i])。
利用單調棧維護單調遞增的棧,我們可以O(n)求出所有的 i 的 L[i], R[i].
Step3 Code:
#include<cstdio>
#include<stack>
using namespace std;
#define ll long long
const int N = 1e5+5;
ll a[N];;
int L[N], R[N], st[N];
int main()
{
int n;
while(~scanf("%d", &n) && n)
{
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
int top = 0;
for(int i = 1; i <= n; i++)
{
while(top && a[st[top-1]] >= a[i]) top--;
L[i] = (top==0) ? 0 : st[top-1];
st[top++] = i;
}
top = 0;
for(int i = n; i >= 1; i--)
{
while(top && a[st[top-1 ]] >= a[i]) top--;
R[i] = (top==0) ? (n+1) : st[top-1];
st[top++] = i;
}
ll ans = 0;
for(int i = 1; i <= n; i++)
{
ans = max(ans, (ll)(R[i]-L[i]-1)*a[i]);
}
printf("%lld\n", ans);
}
return 0;
}