HDOJ 1506 Largest Rectangle in a Histogram (笛卡尔树)

2023-11-09 22:34

本文主要是介绍HDOJ 1506 Largest Rectangle in a Histogram (笛卡尔树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:给出一个由 n n n条矩形组成的图形,每个矩形宽度均为 1 1 1,高度为 h i h_i hi,求该图形中最大的连续矩形面积。
在这里插入图片描述

笛卡尔树的典型题,在此学习一下笛卡尔树,参考博客:
https://www.cnblogs.com/CaptainSlow/p/9282507.html
https://blog.csdn.net/qq_41551359/article/details/82661138
笛卡尔树是由一个序列生成的树形数据结构,从键值上看是一个堆,而对某子树按照中序遍历又对应原序列的一段连续区间,且该区间满足键值均大于(小根堆)或小于(大根堆)该子树的根的键值。因此可以说从索引位置key来看,满足二叉搜索树的特性,从键值value来看,满足堆的性质。如下图可以很形象地看出笛卡尔树的性质。
在这里插入图片描述
对于该题就可以根据输入的序列构建一棵笛卡尔树(构建方法可利用单调栈在 O ( n ) O(n) O(n)的时间复杂度内完成,具体见上述参考博客),搜索每个节点,以该节点的键值作为高的矩形的面积就是以该节点为根的子树大小乘以它的键值。

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
const int MAXN=100010;
struct node{int val,id;node *par,*ls,*rs;node(int i=0,int v=0,node* l=NULL,node* r=NULL){id=i;val=v;ls=l;rs=r;}
};
node* build(int arr[],int siz)
{stack<node*> s;node *now,*next,*last;for(int i=0;i<siz;i++){next=new node(i,arr[i]);last=NULL;while(!s.empty()){if(s.top()->val<next->val){now=s.top();if(now->rs){now->rs->par=next;next->ls=now->rs;}now->rs=next;next->par=now;break;}last=s.top();s.pop();}if(s.empty()&&last){next->ls=last;last->par=next;}s.push(next);}while(!s.empty()){now=s.top();s.pop();}return now;
}
long long ans;
int dfs(node *p)
{if(p==NULL) return 0;int cnt;cnt=dfs(p->ls)+dfs(p->rs)+1;ans=max(1LL*cnt*p->val,ans);return cnt;
}
int main()
{int n;int a[MAXN];while(1){ans=0;scanf("%d",&n);if(n==0) break;for(int i=0;i<n;i++)scanf("%d",&a[i]);node* root=build(a,n);dfs(root);printf("%lld\n",ans);}return 0;
}

这篇关于HDOJ 1506 Largest Rectangle in a Histogram (笛卡尔树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378850

相关文章

[LeetCode] 215. Kth Largest Element in an Array

题:https://leetcode.com/problems/kth-largest-element-in-an-array/description/ 题目 Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not th

C# 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

考虑一个矩形 ABCD,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD = BC = L)。现在给定参数,我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子:  输入:p = (1, 0)         q = (1, 2)         L = 2 输出:(0,0),(0,2),(2,2),(2,0) 解释: 打

OpenCV绘图函数(15)图像上绘制矩形函数 rectangle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 绘制一个简单的、粗的或填充的直立矩形。 这个函数 cv::rectangle 绘制一个矩形轮廓或一个填充的矩形,其两个相对的顶点分别是 pt1 和 pt2。 函数原型1 void cv::rectangle(InputOutputArra

leetcode515 Find Largest Value In Each Tree Row Java

1、用队列进行处理。分别找到每一行中的最大值。 public List<Integer> largestValues(TreeNode root) {List<Integer> result = new ArrayList<>();if(root == null) {return result;}Queue<TreeNode> queue = new LinkedList<>();queu

拉普拉斯算子从笛卡尔坐标系到圆柱坐标系下的推导过程

这段时间推导圆膜振动方程的时候,需要将振动方程从笛卡尔坐标系转换到圆柱坐标系。虽然这个结果书上都有了,但是不满足于直接给出的结果,想自己推导一下。于是就有了下面的内容。总结起来:就是将笛卡尔坐标系下的拉普拉斯算子定义式和圆柱坐标系下拉普拉斯算子定义式之间的关系通过坐标转换对应起来,然后利用待定系数法求解相应的系数就可以了。话不多说,上干货。 笛卡尔坐标系下的拉普拉斯算子定义为: (2-1)

Leetcode209: Maximal Rectangle

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. 给定一个矩阵中,只有0和1,求出这个矩阵的一个最大的子矩阵,其中只包含1. 例如 01101 11010 01110 11110 1

hdoj 2371 decoded string. Decode the Strings

http://acm.hdu.edu.cn/showproblem.php?pid=2371 题意:给出编码的原则,给一个字符串,输出该字符串经过m次解码后的字符串。 啊啊啊啊。。。。无耻的看错题意了,以为给出字符串输出经过m次解码的后的字符串,样例死活过不了,赛后才发现问的是“decoded string”. 即解码后的字符串。。 思路:对于 5 3 2 3 1 5 4 helol

hive sql优化(全排序,笛卡尔积,exist in,决定reducer个数,合并MapReduce)

hive 全排序 优化 分类: hive hadoop hadoop 2013-01-28 20:11 717人阅读 评论(0) 收藏 举报 hive hadoop 目录(?)[+] 使用Hive可以高效而又快速地编写复杂的MapReduce查询逻辑。但是某些情况下,因为不熟悉数据特性,或没有遵循Hive的优化约定,Hive计算任务会变得非常低效,甚至无法得到结果。一个”好”的Hive程序

【hihocoder #1506 : 投掷硬币】递推

【链接】:hihocoder #1506 : 投掷硬币 【题目】: 1506 : 投掷硬币 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一枚神奇的硬币。已知第i次投掷这枚硬币时,正面向上的概率是Pi。 现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少。 输入 第一行包含两个整数N和M。 第二行包含N个实数P1, P

【剑指offer之求1+2+...+n】九度OJ-1506-求1+2+3+...+n

【题目链接】:九度OJ-1506-求1+2+3+…+n 【题目描述】: 题目 1506:求1+2+3+…+n 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1857解决:1060 题目描述: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 输入: 输入可能包含多个测试样例。 对于每个