直方图中的最大矩形,需要卡常。
#include <iostream>
#include <stack>
#define int long long
using namespace std;
int n, a[1000065], vis1[1000005], vis2[1000005];
stack<int> s;
signed main()
{
while (1)
{
memset(a, 0, sizeof a);
memset(vis1, 0, sizeof vis1);
memset(vis2, 0, sizeof vis2);
scanf("%lld", &n);
if (n == 0) break;
for (int i = 1; i <= n; i ++)
{
cin >> a[i];
}
for (int i = 1; i <= n; i ++)
{
while (!s.empty() && a[s.top()] > a[i])
{
vis1[s.top()] = i;
s.pop();
}
s.push(i);
}
while (s.size()) s.pop();
for (int i = n; i >= 1; i --)
{
while (!s.empty() && a[s.top()] > a[i])
{
vis2[s.top()] = i;
s.pop();
}
s.push(i);
}
while (s.size()) s.pop();
int maxn = 0;
for (int i = 1; i <= n; i ++)
{
if (vis1[i] == 0) vis1[i] = n + 1;
maxn = max(maxn, (vis1[i] - vis2[i] - 1) * a[i]);
}
cout << maxn << endl;
}
return 0;
}
只能用c++98(悲)