[学习笔记]笛卡尔树[通俗易懂]

[学习笔记]笛卡尔树[通俗易懂][学习笔记]笛卡尔树

大家好,又见面了,我是你们的朋友全栈君。

笛卡尔树Cartesian Tree

前言

[学习笔记]笛卡尔树[通俗易懂]

符合:祖先权值优先级更高,中序遍历是序列本身

类比treap,只不过不平衡

 

既然不如treap平衡,支持操作就少了。

那么支持的操作,复杂度必须要更优了。

 

建树

增量法

i=1~n

用单调栈维护最右边路径上的点

加入i点,从底向上找到第一个能放的位置,放上去,从栈中弹出的链就是左儿子。

中序遍历性质显然可以保证

权值优先级显然可以保证

O(n)

(所以Treap也可以O(n)建树)

 

例题:

[学习笔记]笛卡尔树[通俗易懂]

求最大矩形

 

1.单调栈直接做。

2.建立小根堆笛卡尔树,每个点的贡献是:子树sz*高度。正确性显然

 

例题2:

 bzoj2616: SPOJ PERIODNI——笛卡尔树+DP

 

例题3:

• 对于任意排列,定义其权值为:
• 首先求出排列的笛卡尔树
• 对于树上有两个儿子的节点,设儿子的下标位置为 ? 和 ?
• 版本一:其对权值的贡献为 |pa-pb|
• 版本二:其对权值的贡献为 |? − ?|
• 假设排列等概率随机,求权值的期望
• ? ≤ 100

两种不同的思路:

版本一:

 

关心儿子位置,

f[i][j]大小为i的树,根节点在j位置权值

枚举左儿子和右儿子的位置a,b,再分配编号:C(i-1,a)

可以把f[i][a]+a之类放在一起进行前缀和优化

纯粹从计数考虑,还要维护方案数

 

个数从小到大扩展,位置合并并分配编号

还有相对设法

 

版本二:

权值绝对值要去掉,从小到大加入

大的树就是放到叶子了

拼接的时候贡献还要考虑父亲权值不好处理

如果有些点必然会有叶子,那么放下一个权值之前,这些位置直接贡献cnt的答案

类似放书那个题

f[i][j][k]放了前i个数,有j个位置还少两个叶子,k个位置还少一个叶子(对未来承诺!)

 

合并

%%immortalCO

数据结构杂题集第三个有提到

定义关键点:一个树最左边和最右边两个链

关键点只有初始的O(n)个

合并x,y时候,对于x的右链和y的左链,从最底下开始往上找到第一个能放的位置,这一段长度设为len

之后这段关键点会被覆盖住,不再存在。

然后y的这个点左儿子和x的这个点的右儿子进行类似fhq的合并,也就是一般的暴力合并

由于路径上的点就是两个段的关键点

关键点然后就消失了。

走的长度就是关键点减少的个数

所以均摊O(n)

从最底下开始找,可以用链表然后链表合并。单纯记录每个点最右边的点也可以

sz什么的pushup就找到了。

(pushup这个不太好找到,最开始一段链很难搞。可以用LCT同时和笛卡尔树合并做,用于打上标记)

挺trick的

 

感悟

具有“treap”的两个性质

对于需要支持操作比较简单的题目,尤其对于序列上有关大小的问题,笛卡尔树的优秀结构可以使得处理有计可施

 

转载于:https://www.cnblogs.com/Miracevin/p/10373626.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107015.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt5.7 + VS2015 环境搭建「建议收藏」

    Qt5.7 + VS2015 环境搭建「建议收藏」简述之前介绍过Qt5.x的环境搭建,5.7开始支持VS2015,为了使用新的开发环境(典型的强迫症),不得不再次进行Qt5.7+VS2015的环境搭建。除了之前介绍的搭建细节之外,其实中间有很多需要注意的部分。下面,主要分享搭建过程以及其中需要注意的一些事项。简述安装VS2015安装Qt57配置QtCreator配置编译器配置调试器HelloWorldVS20

    2022年5月16日
  • EJB学习笔记一(EJB概述)

    EJB学习笔记一(EJB概述)1.前言从今天开始,简单的学习一下有关EJB方面的知识.从自己看EJB有关方面的书籍来看,感觉跟市面上的Spring很像,后来才发现,整个Spring框架实际上是参考了EJB的设计理念,由于学习过Spring,所以现在学习EJB的相关知识,并不是很吃力.接下来会在几篇博客中,简单的书写一下,自己的EJB的认识. 2.什么是EJBEJB全名为EnterpriseJa

    2022年9月30日
  • 抖音程序员表白专用代码教程(如何玩抖音)

    最近很多小伙伴都在抖音上看到了一个vbs表白代码这个玩法,感觉非常的有趣。那么这个是怎么弄的呢?其实很简单。下面小编为大家带来了具体的教程,快来看看吧!抖音vbs表白代码制作教程步骤一:在电脑上新建一个txt文件。步骤二:打开txt文件,复制以下代码粘贴进去(可以修改中文部分,其它代码不要动!)。保存并关闭txt文件。SetSeven=WScript.CreateObject(“WScript.S…

    2022年4月11日
  • pycharm 设置环境变量_linux查看环境变量

    pycharm 设置环境变量_linux查看环境变量今天运行tensorflow的时候,发现在pycharm下,程序无法找到CUDA的libcupti.so文件。而在添加完环境变量:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH/usr/local/cuda/extras/CUPTI/lib64:后,在命令行可以运行程序。然而,在Pycharm中运行程序,仍无法找到CUDA库文件。经过下午的折腾,终于

    2022年8月26日
  • pytorch安装以及pycharm使用pytorch包(windows10)

    pytorch安装以及pycharm使用pytorch包(windows10)1.安装anacondahttps://www.anaconda.com/products/individual#windows在该网站上下载anaconda的包,然后使用默认设置安装即可。为anaconda配置环境变量anaconda和miniconda同为conda官方推荐的conda工具。anaconda和conda的关系,就像github和git的关系,anaconda不光包含了conda命令行软件,还包含了多如牛毛的预装python包,以及令人瞠目结舌的黑科技全家桶。win+R打开

    2022年8月27日
  • JDK1.8新特性CompletableFuture总结

    CompletableFuture这个completableFuture是JDK1.8版本新引入的类。下面是这个类。实现了俩接口。本身是个class。这个是Future的实现类。使用completionStage接口去支持完成时触发的函数和操作。一个completetableFuture就代表了一个任务。他能用Future的方法。还能做一些之前说的executorService配合fu…

    2022年4月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号