直方图求最大面积
作者:
无苦邪
,
2024-04-10 17:15:18
,
所有人可见
,
阅读 3
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include<stack>
#include<algorithm>
#define ll long long
using namespace std;
ll a[100005];
ll r[100005];
ll l[100005];
int main()
{
int n;
while (1)
{
scanf("%d", &n);
if (n == 0) return 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
}
a[n + 1] = 0; //最后一个0
stack<int> st;
st.push(0); //第一个0
for (int i = 1; i <= n + 1; i++)
{
while (!st.empty() && a[i] < a[st.top()])
{
//那么第一个比他小的元素 r区间就是i了
r[st.top()] = i;
//被谁弹出来,谁就是其右边的第一个比它小的元素
st.pop();
}
// 此时元素的右边就算栈顶了
if(!st.empty()) l[i] = st.top(); //入栈前的栈顶是他的右边元素
//栈内右边的元素,是其左边的第一个比它小的元素
st.push(i);
}
long long ans = 0;
for (int i = 1; i <= n; i++)
{
ans = max(ans, (r[i] - l[i]-1) * a[i]);
}
cout << ans << endl;
}
return 0;
}