笛卡尔树(Cartesian Tree)

news/2024/10/6 3:45:12/文章来源:https://www.cnblogs.com/Heartquakes/p/18280926

笛卡尔树(Cartesian Tree)

1. 定义

根据序列构造的满足以下性质的树:

  • 二叉搜索树性质(BST):\(key_{ls} \le key_x \le key_{rs}\)\(key\) 默认为下标。
  • 堆性质:\(val_{x} \le val_{ls} \le val_{rs}\).

2. 构造

  • 如果有 \(key\) 作为第一关键字,则按 \(key\) 升序排序,否则默认下标为 \(key\)
  • 使用单调栈维护右链,按照 \(key\) 升序的顺序添加节点。
  • 加入一个新节点 \(i\) 时,找到右链上第一个 \(val_j \le val_i\) 的节点,将 \(rs_j\) 作为 \(i\) 的左儿子,\(i\) 作为新的 \(rs_j\).
const int N = 1e5 + 5;
int n, root, v[N], fa[N], ls[N], rs[N];
stack<int> stk;void build()
{for(int i = 1; i <= n; i++){cin >> v[i];while(!stk.empty() && v[stk.top()] > v[i])ls[i] = stk.top(), stk.pop();fa[i] = (!stk.empty() ? stk.top() : 0);if(!fa[i]) root = i;if(ls[i]) fa[ls[i]] = i;if(fa[i]) rs[fa[i]] = i;stk.push(i);}return;
}

3. 应用

3.1. 求区间最小值(RMQ)

建立小根笛卡尔树,区间 \([a, b]\) 的最小值是 \(val_{\operatorname{LCA}(a, b)}\).

利用 BST 的性质可以快速求 LCA.

复杂度为树的深度,随机数据下为 \(O(n \log n)\).

int find_min(int a, int b)
{int lca = root;while(lca < a || lca > b){if(lca < a) lca = rs[lca];if(lca > b) lca = ls[lca];}return v[lca];
}

3.2. 求最小值范围

给定一个无序序列和一个下标,求对应的值是多大范围内的最小值。

  • 建立小根笛卡尔树,下标 \(i\) 对应的区间为 \(i\) 的子树中最左边的点到最右边的点。

3.3. 最大矩形

求下图的最大矩形(\(n \le 10^5\)):

image

  • 建立小根笛卡尔树,每个点的贡献是 \(\text{子树大小} \times \text{深度}\).

4. 例题

4.1. P1350 车的放置

\(f_{i,j}\):在 \(i\) 的子树中放 \(j\) 个车的方案数。

\(f_{u, i} = \sum_{j=0}^i son_i \times j!\begin{pmatrix}i-1 \\j\end{pmatrix}\begin{pmatrix}w-(i-j) \\j\end{pmatrix}\).

\(son_i = \sum_{j=0}^i (f_{lc, j} \times f_{rc, i-j})\).

\(n \times m\) 的矩形中放 \(k\) 个车:\(C_n^k \times C_m^k \times k!\).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738632.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GreatSQL 中 Insert 慢是什么情况?

GreatSQL中 Insert 慢是什么情况? 背景概述 客户反映,业务上某张表的 Insert 操作速度很慢,单条 Insert 语句的最大执行时间超过了 5 秒。在收到客户问题后,我们仔细检查了数据库状态以及主机的负载情况,发现目前一切正常,并没有发现数据库故障或主机负载过高导致 insert…

技术思考:小米宣布在手机跑通 13 亿参数大模型,这意味着什么?

雷军在 2023 年度演讲中对小米 AI 布局的主要内容总结: 1、AI 赋能软硬件:小米计划通过 AI 技术增强其软件和硬件的能力 ,雷军认为 AI 在小米的技术研发中起着关键作用。 2.、持续布局:自 2016 年 7 月建立 AI 视觉团队以来, 小米一直在 AI 领域有计划地扩展, 今年 4 月还…

Unity使用后Addressables分包查看Build的资源大小

在Unity的Console窗口中,我们可以点击右上角的三个点,然后点击Open Editor Log,查看编辑的日志。 其中会有记录报错的信息,也会有我们build打包之后资源占比信息,上线小游戏的时候我们可以根据这些信息,看看需要压缩哪些资源

【问题解决】GL-MT3000无线中继模式连接想要中继的5GhzWifi失败

找了很久原因,还送厂换了一次货,但是回来之后仍然遇到相同的问题,最终确定应该是信号干扰所致。 尝试降低MT3000的5GHz的Wifi发射功率到中,然后成功连上想要中继的5GhzWifi,并且稳定运行到现在,问题解决。

寻找适合编写静态分析规则的语言

目前静态分析工具的主要痛点:无法开发自定义规则、对误报和漏报的规则无法快速修改,以及开发自定义规则有一定的难度。为了解决这些问题,我们需要寻找适合编写静态分析规则的语言。本文分享自华为云社区《寻找适合编写静态分析规则的语言》,作者:Uncle_Tom。 1. 程序静态分…

使用JAVA调用配方单保存接口更新数据失败, 使用了SaveParam参数

问题原因是SaveParam参数使用错误 传入json只能是model里的单据数据参数, model之外的参数是靠SaveParam的实例去设置, 金蝶的demo里也是很明显的, 如下图

博客的部署方法论

博客写完后,当然是要发布到网络上的。如果想要部署到服务器上,则需编译构建成静态文件,然后将其上传到服务器上的路径(该路径由我们自己决定),然后在 web 服务器(Nginx 等)上配置访问路径即可10.部署 博客写完后,当然是要发布到网络上的。如果想要部署到服务器上,则需…

安全帽佩戴检测系统

安全帽佩戴检测算法是高危作业环境中不可或缺的环节。传统依靠人工监管的方式存在效率低下、管理范围有 限、时效性差、无法全场监测等诸多缺陷,因此基于图像视觉的安全帽佩戴检测算法逐渐成为企业实施管理的主要手段。近年来,随着工业4.0概念的提出和深度学习等 高新技术的发…

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用前言公司项目是是微服务项目,网关是手撸的一个.net core webapi 项目,使用 refit 封装了 20+ 服务 SDK,在网关中…

安全帽佩戴检测算法

安全帽佩戴检测算法是铁路工程施工人员安全管理中的重点和难点,它对检测算法的准确 率与检测速度都有较高的要求。本文提出一种基于神经网络架构搜索的安全帽佩戴检测算法 NAS-YOLO。该神经网络架构由上、下行操作单元组成,采用二进制门策略对网络架构进行更 新,通过数据驱动…

人员跌倒识别检测算法

人员跌倒识别检测算法是基于视频的检测方法,通过对目标人体监测,当目标人体出现突然倒地行为时,自动监测并触发报警。 人员跌倒识别检测算法基于计算机识别技术,配合现场摄像头,自动识别如地铁手扶梯/楼梯、老幼活动区等公共场所人员摔倒行为,准确率高于90%,及时救援,提…

学校视频监控系统

学校视频监控系统可以借助分布在学校各处的传统监控摄像头对学校的日常生活进行实时安防监控,学校视频监控系统保障学校的日常安全以及对学生的人身财产安全进行及时预警。帮助学校在技术日益进步的当下,提升对学校的安防监控能力和日常管理的效率,使得学校在安防监控这方面…