题意
找到一个面积最大的矩形区域。
思路
对于每一个,找左边第一个比它矮的,再找右边第一个比它矮的。此处可用单调栈实现。
就得到了一个以为最大高度可行区间。就可以算出来这个区域。
单调栈的弹栈操作:清除无用的数据。已经有了更小的,如果要找左边第一个比它小的值,前面的次小数据就没有任何意义了。所以如果要做左边第一个比它小的值,就应该维护栈内的递减。
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; }