首页 > 其他分享 >【学习笔记】笛卡尔树

【学习笔记】笛卡尔树

时间:2023-09-05 17:55:08浏览次数:37  
标签:ch dbinom 笛卡尔 siz 笔记 times 学习 now

概述

有若干二元组 \((k,w)\),笛卡尔树要求关于 \(k\) 满足二叉搜索树的性质,关于 \(w\) 满足堆的性质。

构建

以要求 \(w\) 满足小根堆为例,使用单调栈维护当前的右链。

现将所有二元组按 \(k\) 升序排序,每次插入一个元素时不断弹栈找到第一个小于 \(w\) 的节点,并将当前节点作为其右儿子,将弹掉的部分作为当前节点的左子树右链。

for(int i=1;i<=n;++i){
    int now=top;
    while(now&&p[st[now]]>p[i]) --now;
    if(now) ch[st[now]][1]=i;
    if(now!=top) ch[i][0]=st[now+1];
    top=now;
    st[++top]=i;
}

这种构建方法可以线性建出 Treap 来减小常数。

应用

由于左右子树独立且跨过根的区间最值一定是根,可以用来解决一系列最值问题。

(之前不会笛卡尔树,SA 建这样的结构都是对 \(height\) 建 Kruskal 重构树)

例题

HDU-6305 RMQ Similar Sequence

要求两序列笛卡尔树同构。

实数域内随机出两个数相等概率为 \(0\),直接看作离散化后的排列,而随机出的每个数期望大小 \(\frac{1}{2}\),因此每个序列期望和为 \(\frac{n}{2}\),只需求出有多少合法排列,每个子树内根节点是最小值的概率是 \(\frac{1}{siz}\),累乘即可。

Luogu-P6453 COCI2008-2009#4 PERIODNI

发现最小值两侧的高处不受限制。

建出高度随深度递增的笛卡尔树,考虑 DP,设 \(f_{u,k}\) 表示 \(u\) 子树内放置 \(k\) 个棋子,且位置全部高于 \(h_{fa_u}\) 的方案数。

转移枚举 \(k_1,k_2,k_3\) 表示分别有 \(k_1,k_2\) 个棋子来自左右子树且位置全部高于 \(h_u\),有 \(k_3\) 个棋子放置在 \((h_{fa_u},h_u]\) 之间,转移方程:

\[f_{u,k_1+k_2+k_3}\leftarrow f_{ch_{u,0},k_1}\times f_{ch_{u,1},k_2}\times \dbinom{siz_u-k_1-k_2}{k_3}\dbinom{h_u-h_{fa_u}}{k_3}k_3! \]

HDU-4125 Moles

使 \(a_i\) 满足二叉搜索树,\(i\) 满足小跟堆,建出笛卡尔树。求解使用 KMP 与欧拉序匹配。

HDU-6854 Kcats

观察发现单调栈大小等价于笛卡尔树到根路径上经过右儿子的个数加 \(1\),因此如果已知 \(a\) 序列,那么根应当在 \(1\) 出现的最后一个位置,左子树递归找 \(1\) 出现的最后一个位置,右子树递归找 \(2\) 出现的最后一个位置。

建出树后 DP 过程是:

\[f_u=f_{ch_{u,0}}\times f_{ch_{u,1}}\times \dbinom{siz_u-1}{siz_{ch_{u,0}}} \]

对于一些 \(a_i\) 未知的情况,考虑一个区间 DP,设 \(g_{l,r,k}\) 表示区间 \([l,r]\) 构成子树,且根的 \(a\) 值为 \(k\),转移即:

\[g_{l,r,k}=\sum_{i=l}^r g_{l,i-1,k}\times g_{i+1,r,k+1}\times \dbinom{r-l}{i-l} \]

参考资料

  • OI Wiki

标签:ch,dbinom,笛卡尔,siz,笔记,times,学习,now
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Cartesian_Tree.html

相关文章

  • [编程基础] Python内置模块collections使用笔记
    collections是Python标准库中的一个内置模块,它提供了一些额外的数据结构类型,用于增强Python基础类型如列表(list)、元组(tuple)和字典(dict)等。以下是对collections模块中主要数据结构类的概述:namedtuple:命名元组,创建一个带有名称的tuple,并且可以通过名称访问元素。deque:双端队列,可......
  • SQL学习
    SQL学习通过设置foreignkey(外键)和其他的表关联(不仅可以跟别的表关联,也可以和自己表上的字段关联)primarykey(主键)可以设置一个或多个防止数据重复。sql语句createDATABASEsql_tutorial;创建数据库,数据库名用反引号包围可以防止和关键字冲突showdatabases;展示数据库......
  • springCloud学习笔记整理
    springCloud学习笔记整理1.分布式分布式的概念:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。分布式架构的优缺点:优点:降低服务耦合有利于服务升级和拓展缺点:服务调用关系错综复杂2.微服务微服务的上述特性其实是在给分布式架构制......
  • Java语言笔记2
    Java语言笔记2什么是计算机计算机、程序、硬件、软件的概念计算机的应用:科学计算、数据处理、自动控制、人工智能、网络等计算机硬件CPU、Memory、Motherboard、I/O显卡和GPU的区别:显卡包括了GPU和一些接口。冯诺依曼体系结构JohnvonNeumann(约翰·冯·诺伊曼)计算机......
  • Java语言笔记3
    Java语言笔记3WriteOnce、RunAnywhereJava的特性和优势简单性面向对象可移植性高性能分布式动态性多线程安全性健壮性Java的三大版本JavaSE:标准版(桌面程序、控制台开发)JavaME:嵌入式开发(手机、小家电)(已死)JavaEE:企业级开发(web端、服务器开发)JDK\JRE\JVMJD......
  • 中国科教工作者协会与CCF PTA联合认证学习须知
    中国科教工作者协会与CCFPTA联合认证学习须知1、参与认证人员需在科技学堂(www.sciclass.cn)上进行课程学习,然后在PTA官网(pta.ccf.org.cn)报名并参加认证考试,考试及课程学习达标者,即可获得由中国青少年科技教育工作者协会与中国计算机学会联合颁发的认证证书。具体报名流程及认......
  • 【Python爬虫笔记】爬虫代理IP与访问控制
    一、前言在进行网络爬虫的开发过程中,有许多限制因素阻碍着爬虫程序的正常运行,其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站,网站管理者会使用一些方式进行限制。这时候,代理IP就是解决方案之一。本文主要介绍如何在爬虫程序中使用代理IP以应对反......
  • Python学习 -- Math模块和Random模块
    math模块提供了许多数学函数,用于执行各种数学运算。以下是一些常用的math函数以及相应的示例代码:math.sqrt(x):计算平方根。importmathx=25square_root=math.sqrt(x)print(f"√{x}={square_root}")math.pow(x,y):计算x的y次方。importmathx=2y=3result......
  • 笔记 | element table show-overflow-tooltip 位置偏移的问题
    一、问题因为我目前的项目是微前端的工程,最外层有一个50px的通用头部,所以页面要减去50px。所有页面看似都很完美,但是使用el-table-column的show-overflow-tooltip属性时,tooltip会向下偏移50px。想到的解决办法:按照el-tooltip的属性更改placement="right"能解决。但......
  • dotnet 读 WPF 源代码笔记 渲染层是如何将字符 GlyphRun 画出来的
    从业务代码构建出来GlyphRun对象,在WPF的渲染层里,如何利用GlyphRun提供的数据将字符在界面呈现出来。本文将和大家聊聊从WPF的渲染层获取到GlyphRun数据,到调用DirectX的各个渲染相关方法的过程,也就是WPF绘制文本字符的原理或者实现方法大家印象中的绘制一段文本是调......