题意

找到一个面积最大的矩形区域。
思路
对于每一个,找左边第一个比它矮的,再找右边第一个比它矮的。此处可用单调栈实现。
就得到了一个以为最大高度可行区间。就可以算出来这个区域。
单调栈的弹栈操作:清除无用的数据。已经有了更小的,如果要找左边第一个比它小的值,前面的次小数据就没有任何意义了。所以如果要做左边第一个比它小的值,就应该维护栈内的递减。
Solution
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
#define sc(x) scanf("%lld", &(x))
#define me(L) memset(L, 0, sizeof(L))
ll L[N], R[N], st[N], a[N];
int main() {
ll n, t;
while (sc(n), n) {
for (int i = 1; i <= n; ++i) sc(a[i]);
st[t = 0] = 0;
for (int i = 1; i <= n; ++i) {
while (t && a[st[t]] >= a[i]) --t;
L[i] = st[t];
st[++t] = i;
}
st[t = 0] = n + 1;
for (int i = n; i; --i) {
while (t && a[st[t]] >= a[i]) --t;
R[i] = st[t];
st[++t] = i;
}
ll ans = 0;
for (int i = 1; i <= n; ++i) {
ll now = (R[i] - L[i] - 1) * a[i];
if (now > ans) ans = now;
}
printf("%lld\n", ans);
}
return 0;
} 
京公网安备 11010502036488号