题意

img

找到一个面积最大的矩形区域。

思路

对于每一个,找左边第一个比它矮的,再找右边第一个比它矮的。此处可用单调栈实现。

就得到了一个以为最大高度可行区间。就可以算出来这个区域。

单调栈的弹栈操作:清除无用的数据。已经有了更小的,如果要找左边第一个比它小的值,前面的次小数据就没有任何意义了。所以如果要做左边第一个比它小的值,就应该维护栈内的递减。

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;
}