题目链接
小A的柱状图
题意
这是一个简单的单调栈问题,对于每一个矩形我们可以找出其能够到达的最远位置,所以只需要枚举n个矩形的最大值就ok啦~

#include<bits/stdc++.h>
typedef long long ll;
const int maxn =1e6+5;
using namespace std;
int n,height[maxn],wid[maxn],le[maxn],ri[maxn],b[maxn];//he代表每个矩形的高度,b代表每个矩形的宽度,wid是从1到第i个矩形的总宽度,le ri能到达最左或者最右的第几个矩形 
stack<int>q;
long long ans =0;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        wid[i]=wid[i-1]+b[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>height[i];
    }
    for(int i=1;i<=n;i++)//找每个矩形能到达最左 
    {
        while(!q.empty()&&height[q.top()]>=height[i]) q.pop();
        if(q.empty()) le[i]=1;
        else le[i]=q.top()+1;
        q.push(i);
    }
    while(!q.empty()) q.pop();//一定要清栈剩余元素 
    for(int i=n;i>=1;i--) //找每个矩形能到达最右 
    {
        while(!q.empty()&&height[q.top()]>=height[i]) q.pop();
        if(q.empty()) ri[i]=n;
        else ri[i]=q.top()-1;
        q.push(i);
    }
    for(int i=1;i<=n;i++) //找最大值 
    {
        ans =max (ans,(1LL)*(wid[ri[i]]-wid[le[i]-1])*height[i]);
    }
    cout<<ans<<endl;
    return 0;
}