小A的柱狀圖(柱狀圖中最大的矩形)

題目鏈接
參考:[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 

發佈了17 篇原創文章 · 獲贊 8 · 訪問量 2308
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章