解题报告 『HISTOGRA - Largest Rectangle in a Histogram(单调栈)』
单调栈板子题,代码很简单。
注意将a[n + 1]赋值为0,防止栈中矩形未弹完。
代码实现如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; #define int long long #define rep(i, a, b) for (register int i = (a); i <= (b); i++) const int maxn = 1e5 + 5; int n; int a[maxn], sta[maxn], wid[maxn]; void origin() {memset(sta, 0, sizeof(sta));} int MAX(int a, int b) {return a > b ? a : b;} int read() { int x = 0, flag = 0; char ch = ' '; while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar(); if (ch == '-') { flag = 1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar(); } return flag ? -x : x; } void write(int x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) write(x / 10); putchar(x % 10 + '0'); } signed main() { while (scanf("%d", &n) && n) { origin(); rep(i, 1, n) a[i] = read(); int ans = 0, p = a[n + 1] = 0; rep(i, 1, n + 1) { if (a[i] > sta[p]) { sta[++p] = a[i]; wid[p] =1; } else { int width = 0; while (a[i] < sta[p]) { width += wid[p]; ans = MAX(ans, 1ll * width * sta[p]); p--; } sta[++p] = a[i]; wid[p] = width + 1; } } write(ans); printf("\n"); } return 0; }