ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习笔记 【笛卡尔树】

2021-07-29 20:00:52  阅读:191  来源: 互联网

标签:val 笛卡尔 pos 笔记 儿子 学习 满足 性质


笛卡尔树

笛卡尔树是一种特定的二叉树,可由数列构造,在范围最值查询、范围 \(top k\) 查询 \((range top k queries)\)等问题上有广泛应用。它具有堆的有序性,中序遍历可以输出原数列。——摘自百度百科

笛卡尔树每一个结点由一个键值二元组 \(k\) 构成。要求 \(k\) 满足二叉搜索树的性质,而 \(v\) 满足堆的性质。如图:

笛卡尔树有这样的性质:

对于树上的任何一个节点 ???? 和左右儿子 ???????? 和 ???????? 有:

  1. \(pos[\,ls\,]<pos[\,x\,]<pos[\,rs\,]\) 。
  2. \(val[\,x\,]<val[\,ls\,],val[\,rs\,]\) (大根堆时相反)。

即一棵笛卡尔树的 \(pos\) 满足二叉查找树, \(val\) 满足堆。

笛卡尔树的建树过程:

我们优先满足 ???????????? 即按顺序依次插入,并调整树的结构,使之满足堆的性质。

所以我们要让新插入的点 \(x\) 在这棵树的最右面,沿着树根向右儿子走分两种情况:

  1. 这条链上 \(val\) 都比 \(val[\,x\,]\) 小(小根堆,大根堆相反),那么就让 \(x\) 作为最后一个点的右儿子。
  2. 找到了一个点 \(y\) \(val[\,y\,]>val[\,x\,]\) 此时为了满足堆的性质,\(y\) 必须作为 ???? 的儿子且必须是左儿子。

我们使用单调栈来维护笛卡尔树最右儿子链 \(val\) 的递增(递减)性。

建树过程的具体实现:

这样一棵笛卡尔树就建好了。 code

笛卡尔树的功能:

最简单的一个应用是求元素的左右延伸区间。根据笛卡尔树的性质, \(x\) 一定是 \(x\) 的子树中 \(val\) 最小的(小根堆)。这样我们再对树进行中序遍历,记录下 \(x\) 子树中最左最右的 \(pos\) 即可。

例题:

UVA1619 感觉不错 Feel Good
这是题解

SP1805 HISTOGRA - Largest Rectangle in a Histogram

P2659 美丽的序列 这是题解

AT2060 [AGC005B] Minimum Sum

标签:val,笛卡尔,pos,笔记,儿子,学习,满足,性质
来源: https://www.cnblogs.com/TSZ-think/p/15076806.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有