【题目分析】

本来是单调栈的题目,用笛卡尔树可以快速的水过去。

把每一个矩阵看成一个二元组(出现的顺序,高度)。

然后建造笛卡尔树。

神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵的可能解。

用二元组的第一个下标来限制,使它们在一块儿,然后堆的性质又限制了宽度以及高度。

计算,取最值即可。

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;

#define maxn 100005
#define ll long long

int read()
{
	int x=0,f=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
	return x*f;
}

struct node{
	int id,h;
}a[maxn];
int sta[maxn],top=0,ch[maxn][2],fa[maxn],siz[maxn],n,rt;

void dfs(int k)
{
	if (!k) return ;
	dfs(ch[k][0]);
	dfs(ch[k][1]);
	siz[k]=siz[ch[k][0]]+siz[ch[k][1]]+1;
}

int main()
{
	while (scanf("%d",&n)!=EOF&&n)
	{
		for (int i=1;i<=n;++i) ch[i][0]=ch[i][1]=fa[i]=0;
		for (int i=1;i<=n;++i) a[i].h=read(),a[i].id=i;
		ch[1][0]=ch[1][1]=fa[1]=0; top=0;
		sta[++top]=1;
		siz[1]=1;
		rt=1;
		for (int i=2;i<=n;++i)
		{
			int flag=0,now;
			while (top&&a[sta[top]].h>a[i].h) now=sta[top--],flag=1;
			if (!flag)
			{
				ch[a[sta[top]].id][1]=i;
				fa[i]=a[sta[top]].id;
				sta[++top]=i;
			}
			else
			{
				if (top)
				{
					int z=ch[a[sta[top]].id][1];
					ch[a[sta[top]].id][1]=i;
					fa[i]=a[sta[top]].id;
					ch[i][0]=z;
					fa[z]=i;
					sta[++top]=i;
				}
				else
				{
					fa[now]=i;
					rt=i;
					ch[i][0]=now;
					sta[++top]=i;
				}
			}
		}
		dfs(rt);
		ll ans=0;
		for (int i=1;i<=n;++i) ans=max(ans,(ll)siz[i]*(ll)a[i].h);
		printf("%lld\n",ans);
	}
}

  

POJ 2559 Largest Rectangle in a Histogram ——笛卡尔树的更多相关文章

  1. hdu 1506 Largest Rectangle in a Histogram——笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 关于笛卡尔树的构建:https://www.cnblogs.com/reverymoon/p/952 ...

  2. [hdu1506 Largest Rectangle in a Histogram]笛卡尔树

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506 如图,求最大的矩形面积 思路: 笛卡尔树:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key, ...

  3. [POJ 2559]Largest Rectangle in a Histogram 题解(单调栈)

    [POJ 2559]Largest Rectangle in a Histogram Description A histogram is a polygon composed of a sequen ...

  4. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  5. stack(数组模拟) POJ 2559 Largest Rectangle in a Histogram

    题目传送门 /* 题意:宽度为1,高度不等,求最大矩形面积 stack(数组模拟):对于每个a[i]有L[i],R[i]坐标位置 表示a[L[i]] < a[i] < a[R[i]] 的极 ...

  6. poj 2559 Largest Rectangle in a Histogram (单调栈)

    http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 6 ...

  7. POJ 2559 Largest Rectangle in a Histogram -- 动态规划

    题目地址:http://poj.org/problem?id=2559 Description A histogram is a polygon composed of a sequence of r ...

  8. poj 2559 Largest Rectangle in a Histogram - 单调栈

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19782 ...

  9. POJ 2559 Largest Rectangle in a Histogram(单调栈)

    传送门 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

随机推荐

  1. 数据结构作业——hash(字符串哈希)

    Hash Description 给定长度为 n ( n<=1000000)的字符串,字符串仅由小写字母的前 m ( m<=6) 个字符组成,请你计算出共有多少长度为 k( k<=6 ...

  2. java支持跨平台获取cpuid、主板id、硬盘id、mac地址 (兼容windows、Linux)

    windows: package cn.net.comsys.helper.system.info;   import java.io.BufferedReader; import java.io.F ...

  3. 再次认识ASP.NET MVC

    MVC, V,就是View.视图 M,只应该是ViewModel.视图模型 C,Controller.控制器 我们需要怎么看待并使用这三者. 从你敲入url,我们可以做为入口. 当你敲入url并按了回 ...

  4. php基础之gd图像生成、缩放、logo水印和简单验证码实现

    gd库是php最常用的图片处理库之一(另外一个是imagemagick),可以生成图片.验证码.水印.缩略图等等.要使用gd库首先需要开启gd库扩展,windows系统下需要在php.ini中将ext ...

  5. 第六章 大数据,6.3 突破传统,4k大屏的沉浸式体验(作者: 彦川、小丛)

    6.3 突破传统,4k大屏的沉浸式体验 前言 能够在 4K 的页面上表演,对设计师和前端开发来说,即是机会也是挑战,我们可以有更大的空间设计宏观的场景,炫酷的转场,让观众感受影院式视觉体验,但是,又必 ...

  6. 程序代码中退出函数exit()与返回函数return ()的区别

    程序代码中退出函数exit()与返回函数return ()的区别   exit(0):正常运行程序并退出程序:   exit(1):非正常运行导致退出程序:   return():返回函数,若在主函数 ...

  7. zabbix添加监控主机(三)

    zabbix添加监控服务器. zabbix添加监控服务器(以添加10.10.100.137为例) (1)创建要监控的主机.点击配置(configuration)–>主机(host) –>创 ...

  8. 在MySQL向表中插入中文时,出现:incorrect string value 错误

    在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8.      一.修改数据库的默认字符集   ...

  9. mysql配置远程连接方法之一(改表法)

    1.问题:如果在远程连接报错:1130-host ... is not allowed to connect to this MySql server,可能是你的帐号不允许从远程登陆,只能在local ...

  10. postgresql利用pg_upgrade升级数据库(从8.4升级到9.5)

    其他见:http://my.oschina.net/ensn/blog/636766 本文利用pg_upgrade实现将8.4.18版本升级到9.5.0版本,8.4.18版本为RedHat系统自带pg ...