Largest Rectangle in a Histogramnode
單調棧。
不知道怎麼描述因此用樣例講一下。ios
7 2 1 4 5 1 3 3 最大矩形的高度必定是給你的高度中的一個。 咱們枚舉最大高度。 很明顯以某一高度爲高的矩形的左邊界是該高度左邊第一個比它矮的。 右邊界相似。
咱們能夠用單調棧去維護每個高度左右第一個比他矮的位置便可code
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<stack> #include<algorithm> #define max(a,b) a>b?a:b #define MAXN 100001 typedef long long ll; inline void read(ll &T) { ll x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} T=f?-x:x; } inline void write(ll x) { if(x<0) putchar('-'),write(-x); else { if(x/10) write(x/10); putchar(x%10+'0'); } } ll n; int l[MAXN],r[MAXN]; struct node { ll w,num; }a[MAXN]; std::stack<node> sss; signed main() { while(1) { ll maxx=0; read(n);if(n==0) break; for(int i=1;i<=n;++i) { read(a[i].w);a[i].num=i; } for(int i=1;i<=n;++i) { if(sss.empty()) {l[i]=0;sss.push(a[i]);continue;} node x=sss.top(); while(x.w>=a[i].w) { sss.pop(); if(sss.empty()) break; x=sss.top(); } if(sss.empty()) l[i]=0; else l[i]=sss.top().num; sss.push(a[i]); } while(!sss.empty()) sss.pop(); for(int i=n;i>=1;--i) { if(sss.empty()) {r[i]=n+1;sss.push(a[i]);continue;} node x=sss.top(); while(x.w>=a[i].w) { sss.pop(); if(sss.empty()) break; x=sss.top(); } if(sss.empty()) r[i]=n+1; else r[i]=sss.top().num; sss.push(a[i]); } for(int i=1;i<=n;++i) { ll qwq=a[i].w*1ll*(r[i]-l[i]-1); maxx=max(maxx,qwq); } while(!sss.empty()) sss.pop(); write(maxx);puts(""); } return 0; }