小白初次遇到单调栈,题解参考于:
https://blog.csdn.net/qq_41608020/article/details/89294830
重点:高度小的矩形整一个都可以与高度大的矩形的一部分合并,而高度大的矩形不能够整个与高度小的矩形合并。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll a[maxn],h[maxn];
int main()
{
int n;
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]), a[i]+=a[i-1];
for(int i=1;i<=n;++i)
scanf("%lld",&h[i]);
stack<int> st; //构造一个单调递增栈
st.push(0);
ll ans=0;
for(int i=1;i<=n+1;++i) //循环止于n+1,方便操作
{
while(h[i]<h[st.top()]) //如果待插入元素不满足单调性,就要将部分元素弹出栈
{
int id=st.top(); st.pop();
ll width;
if(!st.empty())
width=a[i-1]-a[st.top()];
else width=a[i-1];
ans=max(ans,width*h[id]);
}
st.push(i);
}
printf("%lld\n",ans);
return 0;
}
附关于单调栈的博客:
https://blog.csdn.net/WuBaizhe/article/details/70136174