维护一个单调递增的队列,如果一个新的柱比之前的短,那就更新最大的矩形方案。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
ll n,m,w[1000005],h[1000005];
int main ()
{
ll T,i,t,j,k,p,sum=0;
cin>>n;
for(i=1;i<=n;++i){
cin>>p;
w[i]=w[i-1]+p;
}
for(i=1;i<=n;++i)
cin>>h[i];
h[n+1]=0;
stack<ll> s;
s.push(0);
for(i=1;i<=n;++i){
if(h[i]>=h[s.top()]||s.empty())
s.push(i);
else{
while(!s.empty()&&h[i]<h[s.top()]){
int l=s.top();
s.pop();
sum=max(sum,(w[i-1]-w[s.top()])*h[l]);
}
s.push(i);
}
}
cout<<sum<<endl;
return 0;
}
京公网安备 11010502036488号