題目鏈接
參考:[C++] LeetCode 84. 柱狀圖中最大的矩形
/*
如果idx.size()爲空 時 得到l=1 是讓人費解的
可以利用反證法 如果 存在小於 h[p]的數 那idx.size()>1
故不存在 不存在<h[p] 從 1 到 p 都是大於等於 h[p]
*/
#include<bits/stdc++.h>
using namespace std;
const int inf= 0x3f3f3f3f;
typedef long long ll;
const int maxn = 1e6+10;
ll s[maxn],h[maxn];
int n;
int main()
{
ll t;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld",&t);
s[i] = s[i-1]+t;
}
ll ans = -1;
for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
vector<ll>idx; //idx 是一個有序的遞增的棧
for(int i=1;i<=n;i++)
{
if(!idx.size() || h[i]>h[idx.back()]) idx.push_back(i);
else
{ //r = s[i-1]
while(idx.size()&&h[idx.back()]>=h[i])
{
int p = idx.back();
idx.pop_back();
int l = 0;
if(idx.size()==0) l = 0;
else l = idx.back();
int r = i;
ans = max(ans,h[p]*(s[r-1]-s[l]));
}
idx.push_back(i);
}
}
while(idx.size())
{
int p = idx.back();
idx.pop_back();
int l ;
if(idx.size()==0) l = 0;
else l = idx.back();
int r = n;
ans = max(ans,h[p]*(s[r]-s[l]));
}
cout<<ans<<endl;
}
// 1 3 2 5 6
//5 2 3 4 2