HDU 1506 && POJ 2559 Largest Rectangle in a Histogram (单调队列)

24 篇文章 0 订阅

题目链接:POJ 2559  Largest Rectangle in a Histogram 

题目链接:HDU 1506  Largest Rectangle in a Histogram 

题意:给出一串序列表示对应矩形的高度,求整个图中最大的矩形区域。

2, 1, 4, 5, 1, 3, 3 

如图所示:



思路:每个矩形向左向右最大能扩张到的长度乘上他的高度,求最大值就是答案。

用单调队列维护序列递增,出队列的元素即是“极值”点

注意:要用int64.


AC代码:


#include<stdio.h>
#include<string.h>
#define ll __int64
struct node
{
	ll l,r;
	ll sum;
};
struct node que[100010];
ll h[100010];
ll pre[100010],next[100010];//pre记录hi向左递减最远位置,next记录hi向右递减最远位置,

int main()
{
	ll n,i;
	ll head,tail;
	while(scanf("%I64d",&n)!=EOF,n)
	{
		memset(que,0,sizeof que);
		for(i=1;i<=n;i++)
		{
			scanf("%I64d",&h[i]);
			pre[i]=n;
			next[i]=1;
		}
		head=1,tail=0;
		for(i=1;i<=n;i++)
		{
			while(head<=tail && h[i]<que[tail].sum)//维护单调递增队列
			{
				pre[que[tail].l]=i-1;//出队列的元素是他扩张右边最远位置
				tail--;//弹出元素
			}
			que[++tail].sum=h[i];//入队列
			que[tail].l=i;//记录位置。
		}
		head=1,tail=0;
		for(i=n;i>=1;i--)
		{
			while(head<=tail && h[i]<que[tail].sum)
			{
				next[que[tail].r]=i+1;//出队列的元素是他扩张左边最远位置
				tail--;
			}
			que[++tail].sum=h[i];
			que[tail].r=i;
		}
		ll ans=0,temp;
		for(i=1;i<=n;i++)
		{
			temp=(pre[i]-next[i]+1)*h[i];
			if(temp>ans)
				ans=temp;
		}
		printf("%I64d\n",ans);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值