Link
SPOJ1805 HISTOGRA - Largest Rectangle in a Histogram
Question
在一条水平线上有 \(n\) 个高为 \(a_i\) 的矩形,求包含于这些矩形的最大子矩形面积。
Solution
我们定义 \(L_i\) 表示有 \(a_i\) 这个高度的一根悬线,往左最多能平移到什么位置
初始化显然,\(a_i=i\)
考虑转移
- 如果当前 \(l_i=1\) 则已经扩展到了
- 如果当前 \(a_i > a_{l_i-1}\) 则从当前悬线不能平移到 \(L_i-1\)
- 如果当前 \(a_i \le a_{l_i-1}\) 则当前悬线能平移到 \(Li-1\) 往左边平移到的最远的地方
同样的构造一个 \(R_i\) 就好了
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=100005;
int N,a[maxn];
int L[maxn],R[maxn];
int main(){
freopen("SP1805.in","r",stdin);
while(scanf("%d",&N)!=EOF&&N){
LL ans=0;
for(int i=1;i<=N;i++) scanf("%d",&a[i]),L[i]=R[i]=i;
for(int i=1;i<=N;i++)
while(L[i]>1&&a[i]<=a[L[i]-1]) L[i]=L[L[i]-1];
for(int i=N;i;i--)
while(R[i]<N&&a[i]<=a[R[i]+1]) R[i]=R[R[i]+1];
for(int i=1;i<=N;i++)
ans=max(ans,(LL)(R[i]-L[i]+1)*a[i]);
printf("%lld\n",ans);
}
return 0;
}
标签:平移,SPOJ1805,int,题解,Histogram,maxn,Largest,Rectangle
From: https://www.cnblogs.com/martian148/p/17830530.html