题意:
给你一个柱状图,有n根柱子,给予你每根的宽度和高度,求柱状图的最大矩形面积?

思路:
单调栈,维护一个单调递增的栈,维护高度和左边界。
当h[i]>栈顶元素的高度时入栈,左边界不变。
当h[i]<栈顶元素的高度时,栈顶元素出栈,并计算以该栈顶元素高度为一条边的矩形最大面积(既(右边界-左边界) * 高度)。直到栈为空或h[i]>栈顶元素的高度时停止。将其入栈。如果栈为空,左边界不变,否则更新左边界。
当h[i]=栈顶元素的高度时,开始下一个元素。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <string.h>
#include <map>

#define inf 1000000007
#define eps 0.00000001
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int maxn=100005;

inline int read()
{
    char c=getchar();
    int f=1, x=0;
    while(c>'9'||c<'0')
    {
        if(c=='-')
        {
            f=-1;
        }
        c=getchar();
    }
    while(c<='9'&&c>='0')
    {
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar();
    }
    return f*x;
}

ll d[1000005], a[1000005];

struct w
{
    ll s, x;
}w[1000005];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        ll di;
        scanf("%lld",&di);
        d[i]=d[i-1]+di;
    }
    for(int i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
    }
    int p=0;
    ll ans=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]==w[p-1].x)
        {
            continue;
        }
        if(p==0||w[p-1].x<a[i])
        {
             w[p].s=d[i];
             w[p].x=a[i];
             p++;
             continue;
        }
        while(p!=0&&w[p-1].x>a[i])
        {
            ans=max(ans,(d[i]-w[p-1].s)*w[p-1].x);
            p--;
        }
        w[p].x=a[i];
        p++;
    }
    while(p!=0)
    {
         ans=max(ans,(d[n]-w[p-1].s)*w[p-1].x);
         p--;
    }
    cout << ans << endl;
    return 0;
}