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

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

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

笛卡尔树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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis log plugin 激活码[最新免费获取][通俗易懂]

    (mybatis log plugin 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M3Q9SD5XW-eyJsa…

    2022年3月28日
    42
  • GTest 总结_gtest单元测试

    GTest 总结_gtest单元测试GoogleC++单元测试框架(简称Gtest),可在多个平台上使用(包括Linux,MacOSX,Windows,Cygwin和Symbian),它提供了丰富的断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。1断言一般的,要测试一个方法(函数)是否是正常执行的,可以提供一些输入数据,在调用这个方法(函数)后,得到输出数据,然后检查输出的数据是否与我们期望的结果是一致的,若一致,则说明这个方法的逻辑是正确的,否则,就有问题。在对输出结果进行检查(chec.

    2022年9月29日
    5
  • 锂电池充电IC_锂电池充电器电路

    锂电池充电IC_锂电池充电器电路HE4484E是一款5VUSB适配器输入,高精度双节锂离子电池充电管理芯片。具有0V充电功能,涓流充电、恒流充电、恒压充电和自动截止、自动再充等一套完整充电循环的充电管理芯片。芯片内部特设9V抗浪涌,芯片应用更安全可靠。HE4484E标准浮充电压为8.40V,其底部带有散热片接地的ESOP8封装,极其精简的外部器件,使得HE4484E成为便携式双节锂锂电池充电应用的理想选择。HE4484E适合USB适配器或其它5V适配器工作,极大降低了外部配件成本。当输入电压(USB电源或AC适配器)被拿掉时,HE4484

    2022年10月6日
    2
  • 安装AIC准则使用前进法后退法和逐步回归法进行变量选择的r语言代码

    安装AIC准则使用前进法后退法和逐步回归法进行变量选择的r语言代码setwd(“C:/Users/IBM/Desktop/研一课程/2.2回归分析/回归作业”) #设定当前的工作目录shuju=read.table(“shuju.txt”,header=T)shuju #读取数据#采用AIC原则自动选择模型-前进法shuju.reg1shuju.regforward2summary(shuju.regforward2)#采用A

    2022年5月23日
    62
  • cad注释比例和打印比例不一样_CAD中的打印比例,绘图比例和注释全局比例详解…

    cad注释比例和打印比例不一样_CAD中的打印比例,绘图比例和注释全局比例详解…如上图同一条线段,在不同的标准格式如下(线宽设置相同,字高度都是3.5):第一个尺寸是测量因子为1,标注全局因子为2;第二个尺寸测量因子为2,标注全局因子为2;第三个尺寸测量因子为1,标注全局因子为1可见:1、测量因子影响的是标准尺寸的大小,2、标注全局因子影响的是字体和箭头的大小,3、他们的变化对线宽是没有影响的。关于他们对字体的大小的影响:打印比例和标注全局因子对打印出来的蓝图的字体会有影响。…

    2022年5月14日
    120
  • c语言结构体数组怎么初始化,c语言结构体数组初始化「建议收藏」

    c语言结构体数组怎么初始化,c语言结构体数组初始化「建议收藏」最近看一段代码有所迷惑,先简单总结一下。有关结构体数组初始化的问题struct_m_usmart_nametabusmart_nametab[]={#ifUSMART_USE_WRFUNS==1//如果使能了读写操作(void*)read_addr,”u32read_addr(u32addr)”,(void*)write_addr,”voidwrite_addr(u32addr,…

    2022年7月18日
    31

发表回复

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

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