1. 程式人生 > >51nod-【1102 面積最大的矩形】

51nod-【1102 面積最大的矩形】

 收藏  關注 有一個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下: 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。 Input
第1行:1個數N,表示陣列的長度(0 <= N <= 50000)
第2 - N + 1行:陣列元素A[i]。(1 <= A[i] <= 10^9)
Output
輸出最大的矩形面積
Input示例
6
2
1
5
6
2
3
Output示例

10

和poj的2082是一類題目,其實我們對於每一個小的矩形,
它的最大面積就是這個小矩形能向左右延伸的最大長度,
那肯定是左邊第一個小於它的和右邊第一個小於它的
我們用到一個棧,(棧按照高度從小到大順序,假設每一個小矩形的
寬度為1);對於當先小矩形的高度小於棧頂小矩形的高度,那麼我們
就可以計算出在這其中的小矩形的面積的最大值,一直出棧,直到
棧頂小矩形的高度小於當前小矩形的高度為止 


#include<cstdio>
#include<stack>
using namespace std;
typedef long long LL;
struct rec
{
	LL w,h;
}a; 
int main()
{
	int n;
	scanf("%d",&n);
	LL ans=0,toph=0;
	stack<rec>sta;
	while(n--)
	{
		scanf("%lld",&a.h);
		a.w=1;
		if(a.h>=toph)
			sta.push(a);
		else
		{
			LL tempw=0,temps=0;
			while(!sta.empty()&&sta.top().h>a.h)
			{
				tempw+=sta.top().w;
				temps=sta.top().h*tempw;
				if(temps>ans)
					ans=temps;
				sta.pop(); 
			}
			a.w+=tempw;
			sta.push(a);
		} 
		toph=a.h;
	}
	LL total=0,temps=0;
	while(!sta.empty())
	{
		total+=sta.top().w;
		temps=total*sta.top().h;
		if(temps>ans)
			ans=temps;
		sta.pop(); 
	} 
	printf("%lld\n",ans); 
	return 0;
}