【poj 2559 Largest Rectangle in a Histogram】【單調棧】
阿新 • • 發佈:2018-12-24
【連結】
【題意】
在一條水平線上有若干緊挨的矩形,求包含於這些矩形的並集內部的最大的矩形的面積(矩形個數<=1e5)
【分析】我們先考慮,若矩形的高度從左往右單調遞增,那麼答案顯而易見嘗試以每個矩形的高度為最終矩形的高度,並把寬度延伸到右邊界,得到一個矩形,取最大。如果下一個矩形的高度比上一個小,那麼該矩形想貢獻的話,這個矩形的面積的高度不可能超過比自己高度,換句話說,對於之前高度大於當前矩形的高度的,高於部分已經沒有用了。用單調棧維護
【程式碼】
#include<cstdio> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 1e6 + 5; int a[maxn]; int sta[maxn]; int w[maxn]; int main() { int n; while (~scanf("%d", &n),n) { memset(sta, 0, sizeof(sta)); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } a[n + 1] = 0; int top = 0; ll ans = 0; for (int i = 1; i <= n+1; i++) { if (a[i] > sta[top]) { sta[++top] = a[i]; w[top] = 1; } else { int width = 0; while (sta[top] > a[i]) { width += w[top]; ans = max(ans, (long long)width*sta[top]); top--; } sta[++top] = a[i]; w[top] = width+1; } } printf("%lld\n", ans); } }