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

算法合集 | 神奇的笛卡尔树 - HDU 1506 原文地址:https://cs.v8cloud.cn/article.html?blog_id=225         笛卡尔树是一个很有意思的树形结构,因为它同时满足两个性质,从key(key就是索引位置,如下图中9的key为1,3的key为2......)来看,满足二叉搜索树的特性,从value来看,满足堆的性质。           重点参考下图,图片来自维基百科,还算是能够比较形象的... 阅读详情

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.youkuaiyun.com/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;
}

融合ZILN损失与深度学习的LTV预测:从概率分布到精准营销决策 本文探讨了融合ZILN损失与深度学习的LTV预测方法,通过深度概率模型精准预测用户生命周期价值(LTV),优化营销决策。文章详细解析了ZILN损失函数的优势、模型架构设计要点及工程化落地实践,帮助企业在预算分配、用户分层等场景实现数据驱动的精准营销。 阅读详情

相关推荐

用STC8单片机解码EV1527遥控信号:从波形分析到C代码实现(附完整库)

本文详细介绍了如何使用STC8单片机解码EV1527遥控信号,从波形分析到C代码实现的完整过程。内容包括EV1527协议解析、硬件搭建、信号捕获技巧、解码算法实现及优化策略,并附有完整库代码,帮助开发者快速实现智能家居设备的无线控制。

weixin_34093995的博客 295

杭电 1505 动态规划

这道题基本上和杭电2870是一样的,代码绝大部分都一样。题目: City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2011 Accepted Submission(s): 809 Problem Descr

936

若依集成mybatisplus、兼容旧分页【亲测有效】

service类继承ServiceImpl类 实现 你的Service接口。hutool工具包和lombok工具包如果不需要的话可以自行删除并修改后面的类里面的代码。自带的pagehelper用的1.4.6里面的jsqlparser用的4.5.0。mybatis-plus用的3.4.2里面的jsqlparser用的4.0.0。jsqlparser包,不剔除是这样的,有个冲突,我用的前端写的请求,返回的格式和原来的一样,已兼容。你的Entity类上面需要增加表的名字。

lh155136的博客 3566

POJ 2559-Largest Rectangle in a Histogram 解题报告 【笛卡尔树与单调栈】

POJ 2559-Largest Rectangle in a Histogram 结题报告 【笛卡尔树与单调栈】

IDoubleTong的博客 712

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

从ROS2到ROS1:Lightning-LM激光SLAM模块的移植实践与核心代码解析

本文详细解析了将高性能激光SLAM算法Lightning-LM从ROS2移植到ROS1的完整实践过程。针对ROS1与ROS2在节点初始化、话题通信、参数服务器及TF发布等核心API的差异,文章提供了loc_system和slam模块的核心代码改造示例,并给出了适配catkin的CMakeLists.txt与package.xml配置方案,帮助开发者在现有ROS1生态中高效集成先进的SLAM模块。

weixin_29224529的博客 172

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

题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506 如图,求最大的矩形面积 思路: 笛卡尔树:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value。光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)...

weixin_30321449的博客 170

Unity新手必看:5分钟搞定TextMeshPro中文乱码,告别小方块(附7000+常用字库)

本文详细介绍了Unity中TextMeshPro中文乱码问题的解决方案,包括快速生成中文字体的步骤和优化技巧。通过使用支持中文的.ttf字体文件和自定义字符集,开发者可以在5分钟内解决TMP显示小方块的问题,提升游戏或应用的文本显示效果。

weixin_33095355的博客 362

HDU1506_Largest Rectangle in a Histogram

题目大意:给你一个直方图,告诉你各个条形矩形的高度,求基线对齐构成的矩形中面积 最大的矩形的面积对于每一个矩形。面积 = h[i]*(j-k+1),其中j,k是左右边界,h[i]是矩形 的高。并且对于j <= x <= k,h[i] <= h[x]。 本题中,找到左右边界j,k是关键。 利用动态规划的方法,对于位置i,如果左边条形矩形的高度大于它本身,那么左边的左边 界一定也满足位置i的左边界。同理如果右边条形矩形的高度大于它本身,那么右边的右边 界也一定满足位置i的右边界。迭代循环下去。直到找到i的左右边

程序员充电站(itcharge) 3347

DeepLearning tutorial(7)深度学习框架Keras的使用-进阶

上一篇文章总结了Keras的基本使用方法,相信用过的同学都会觉得不可思议,太简洁了。十多天前,我在github上发现这个框架的时候,关注Keras的人还比较少,这两天无论是github还是微薄,都看到越来越多的人关注和使用Keras。所以这篇文章就简单地再介绍一下Keras的使用,方便各位入门。主要包括以下三个内容: 训练CNN并保存训练好的模型。 将CNN用于特征提取,用提取出来的特征训练SVM。

wepon的专栏 2万+

FineReport实战-- 国内外各地区销售数据分析 多个图表联动

进行国内外各地区业务员销售数据分析是一项复杂但极具价值的任务,它可以帮助企业了解不同市场的表现,并据此调整销售策略以提高整体绩效。实现功能:同一个报表里面多个图表联动问题。

Davina_yu的博客 1198

hdu1506

问题:有N条的长条状的矩形,宽度都为1,第i条高度为Hi,相邻的竖立在x轴上,求最大的子矩形面积。 1≤ N≤ 105 1≤ Hi≤ 109 分析:我们只需要求出每条矩形最多可以向两边拓展的宽度,就可以算出以这个矩形高度为高的最大子矩形面积。最后我们求一个最大值即可。这里可以用dp或者笛卡尔树。笛卡尔树关键在于构造。 笛卡尔树的构造方式为:首先我们按照横坐标从左往右进行处理,同...

常胜将军的博客 539

CKA-题库-简洁参考答案-反复练习20遍-必过!!!

新版CKA考试已于2020年9月1日正式上线! 考试模式:线上考试 考试时间:2小时 认证有效期:3年 软件版本:Kubernetes v1.19 重考政策:可接受1次重考 经验水平:中級 题目数量:17题 题库量小:随机的题目重复率极高 考试时可打开两个浏览器Tab,一个是考试窗口,一个用来查阅官方文档](https://kubernetes.io/docs/) 01 Task - 英文 Create a new ClusterRole named deployment-clusterrole tha.

随笔记录-分享&记忆 7315

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

题目传送门 解题思路: 来来来,笛卡尔树了解一下 代码1:(非要用结构体版) #include<bits/stdc++.h> using namespace std; #define ll long long #define for1(i,a,b) for (int i=a;i<=b;i++) #define for0(i,a,b) for (int i=a;i&l...

shadiao.的博客 280

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HDOJ1506-Largest Rectangle in a Histogram

Largest Rectangle in a Histogram   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20821    Accepted Submission(s): 6351     Problem Descr...

Revenant_Di的博客 271

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hdoj 1506 Largest Rectangle in a Histogram 【单调栈】

题目链接:hdoj 1506 Largest Rectangle in a Histogram Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15601 Ac

世界很大 501

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU 1506(DP)

Largest Rectangle in a Histogram<br />Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)<br />Total Submission(s): 1982    Accepted Submission(s): 645<br />Problem DescriptionA histogram is a polygon composed of a sequence

-- bird -- 1043

HDOJ 1506 Largest Rectangle in a Histogram(单调栈)

LargestRectangle in a Histogram Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17953    Accepted Submission(s): 5368 Problem Description

Dust_heart的博客 385

HDOJ 1506 Largest&nbsp…

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意:给定一个条形统计图,找出一个矩形可以覆盖的最大面积 开两个数组r[](right),l[](left), 分别记录左边和右边能构成矩形的最远的边 #include #define maxint 200000 __int64 a[maxint]; __int64 l[maxint]; __i

stven_king的专栏 808

HDU 1506(单调栈)

题意   给出一个长度为n的序列,这些序列代表每个宽度为1的矩形的高,矩形是按顺序连在一起的,问最大相连面积(高为相连矩形的最小)。 解题思路   对于每个最大连续的矩阵区间,如果它的边界有比他高的矩形,那么高的矩形肯定会被合并进去的,这与假设相违背,则对于每个最大区间,其边界肯定是比相邻矩阵高的大。即找到每个节点的从左(从右)第一个比它小的节点,这样就是当前节点能构成的最大连续矩形...

博学 笃志 切问 近思 1281

暑期dp46道(8)--HDOJ 1506 Largest Rectangle in a Histogram

题目链接:http://acm.hdu.edu.cn/viewcode.php?rid=17848610 这题可以看成是二维矩阵求最大子矩阵限定在某一行的情况。 最大子矩阵求法: 用h[i][j]、r[i][j]和l[i][j]分别表示(i,j)点向上、向右和向左方向上的最大延伸(h[i][j]其实可以看做该点最大矩阵的高,r[i][j]和l[i][j]只是表示可以在

退役ACMer 496

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

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 关于笛卡尔树的构建:https://www.cnblogs.com/reverymoon/p/9525764.html 笛卡尔树在 key 上满足二叉搜索树,在 value 上满足堆;一般 key 就是原序列里的位置,这样一个子树对应原序列的一段连续区间。 这个构建方法就是给最右链维护单调栈,...

weixin_34415923的博客 167

POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)

题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了,这个题目恰好发现可以用笛卡尔树实现,拿来练练手,根据笛卡尔树的性质,对于每个矩形,以出现的下标为 key ,高度为 val ,维护一个小顶堆的笛卡尔树,那么对于树上每个节点的 val 乘以子树的大小就是当前节点可以做出的贡献,维护一下最大值就是答案了 为了防止特殊情况的出现,可以预处理在单调栈中加入一个

Falcon的博客 482

HDU 1506 (DP求最大子矩阵)

Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14750    Accepted Submission(s): 4241 Problem Descripti

HHH的专栏 592

POJ 1785 Binary Search Heap Construction 【笛卡尔树构造,线段树RMQ(Range Max/Min Query)】

题目注意: 两个要求,1. 第一关键字满足搜索序,2. 第二关键字满足堆的性质。 这道题目的标准(简单)解法:笛卡尔树。 但是还有: 分治+RMQ, 其中,RMQ问题有两种方法:线段树和Sparse Table算法。 笛卡尔树定义:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value。光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比

智障 3886

HDOJ 1506 Largest Rectangle in a Histogram

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意:如图一样,找出其中最大能形成的矩形 这题我们可以用贪心去解决,贪心的策略就是找到每一个点它往左边延伸比第一个它a[i]小的点l,和往右边延伸第一个比它大的点r,那么对于每一个点,能形成的最大的矩形面积就是(l-r+1)*a[i],这样我们就遍历每一个点就能找到最大值。 #in

RaAlGhul的博客 466
上一篇: 2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest C. Carpet (树链剖分+构造)
下一篇: 2019牛客暑期多校训练营(第一场)E ABBA (动态规划)
sdxtcqs
博客等级 码龄11年 8粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值