维护一个单调递增的队列,如果一个新的柱比之前的短,那就更新最大的矩形方案。

#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;
}