POJ 2082 Terrible Sets

題意:給你連續n個矩陣的長和寬,求出最大連續矩陣的面積。

單調棧。也可用DP寫,具體和HDU1505類似。這裏就寫單調隊列了。

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef __int64 int64;
typedef long long ll;
#define M 50005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007

ll q[M] , sum[M] , x[M] , y[M] , lef[M] , rig[M];

int main()
{
	ll i , top , n , ans;
	while (~scanf("%lld",&n) , n != -1)
	{
		top = ans = 0;
		for (sum[0] = 0 , i = 1 ; i <= n ; i++)
		{
			scanf("%lld%lld",x+i,y+i);
			sum[i] = sum[i-1]+x[i];
		}

		top = 0;
		for (i = 1 ; i <= n ; i++)
		{
			while (top > 0 && y[q[top-1]] > y[i])
			{

				top--;
				rig[q[top]] = i-q[top];
			}
			if (top <= 0)lef[i] = i;
			else lef[i] = i-q[top-1];
			q[top++] = i;
		}
		while (top)
		{
			rig[q[top-1]] = n-q[top-1]+1;
			top--;
		}

		ans = -(1<<30);

		for (i = 1 ; i <= n ; i++)
		{
			ll temp = (sum[i+rig[i]-1]-sum[i-lef[i]])*y[i];
			ans = max(ans,temp);
		}

		printf("%lld\n",ans);
	}
	return 0;
}


 

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