【题解】hdu1506 Largest Rectangle in a Histogram
程序员文章站
2023-11-08 19:39:40
[TOC] 题目 "Largest Rectangle in a Histogram" 思路 单调栈。 不知道怎么描述所以用样例讲一下。 我们可以用单调栈去维护每一个高度左右第一个比他矮的位置即可 $Code$ ......
目录
题目
largest rectangle in a histogram
思路
单调栈。
不知道怎么描述所以用样例讲一下。
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; }
推荐阅读
-
【题解】hdu1506 Largest Rectangle in a Histogram
-
HDU 1506 Largest Rectangle in a Histogram(单调栈)
-
Largest Rectangle in Histogram
-
Largest Rectangle in Histogram
-
Largest Rectangle in Histogram
-
Largest Rectangle in Histogram
-
Largest Rectangle in Histogram
-
Largest Rectangle in Histogram
-
Largest Rectangle in Histogram
-
【题解】hdu1506 Largest Rectangle in a Histogram