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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值