思路
枚举每个矩形,求出该矩形向左右两侧延伸能得到的最大矩形面积: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; }