思路
枚举每个矩形,求出该矩形向左右两侧延伸能得到的最大矩形面积:res_i
答案就是 max(res_1,res_2,...,res_n)
代码中一些变量的解释:
l[i]:矩形 i 的左边界:从 i 向左延伸,第一个比其高度小的矩形位置
r[i]:同理
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
int l[N],r[N];
int a[N],h[N];
int stk[N];
int hh,n;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],a[i]+=a[i-1];
for(int i=1;i<=n;i++) cin>>h[i];
stk[++hh]=0;
for(int i=1;i<=n;i++){
while(hh&&h[i]<=h[stk[hh]]) hh--;
l[i]=stk[hh];
stk[++hh]=i;
}
hh=0;
stk[++hh]=n+1;
for(int i=n;i>=1;i--){
while(hh&&h[i]<=h[stk[hh]]) hh--;
r[i]=stk[hh];
stk[++hh]=i;
}
ll res=-1;
for(int i=1;i<=n;i++) res=max(res,(ll)h[i]*(a[r[i]-1]-a[l[i]]));
cout<<res<<endl;
return 0;
}

京公网安备 11010502036488号