笛卡尔树
1.随机化算法2.组合数学3.概率和期望4.树链剖分5.矩阵乘法与矩阵快速幂6.最短路7.卡特兰数、Prüfer 序列、BSGS8.分块和莫队9.AC 自动机10.平衡树11.基础字符串算法12.基础数论13.Miller-Rabin 与 Pollard-Rho14.广义后缀自动机15.后缀自动机 SAM16.回文自动机 PAM17.Manacher18.后缀数组19.01 分数规划20.网络流21.整体二分22.cdq 分治23.点分治24.虚树25.扫描线
26.笛卡尔树
27.基环树28.树哈希29.莫比乌斯反演30.二分图31.朱刘算法32.最大团33.杂项34.杜教筛35.拉格朗日插值36.线段树综合37.可持久化数据结构38.K-D Tree39.Burnside 引理与 Polya 定理40.线性基41.替罪羊树42.LCT43.插头 dp44.原根45.多项式乘法46.斯特林数47.二项式反演与斯特林反演48.Min-Max 容斥49.辛普森积分法50.Min_25 筛51.凸包52.2-SAT1 定义
笛卡尔树是一种二叉树,每一个节点由二元组
当
看到这个定义,会发现与 Treap 十分相似。
实际上,Treap 就是一种特殊的笛卡尔树。
通常情况下,将下标作为
2 建树
2.1 过程
首先由定义可以直接得出一个
笛卡尔树有线性的构造方式。
我们先将所有元素按照
那么此时我们观察右链,假设当前节点是
如果没有找到这个
现在我们考虑维护右链,因为维护右链的过程中就可以建好树。显然右链的
2.2 代码
有了上面的分析,代码就不难了:
int s[Maxn], top;
for(int i = 1; i <= n; i++) {
int k = top;
while(k && w[s[k]] > w[i]) k--;
if(k) rs[s[k]] = i;
if(k < top) ls[i] = s[k + 1];
s[++k] = i;
top = k;
}
3 用途
笛卡尔树适合解决与最值相关的问题,不过先给出一些性质(以小根堆为例):
- 以
为根的子树是一段连续的区间,且区间最小值就是 - 区间上
的最小值就是 。 - 若
随机,则树高期望为 。(这样做就是 Treap 了)。
下面举一例:
3.1 [例 1] 最大子矩形问题
形式化题意:给定数组
,求 。
这道题是经典的单调栈题,不过也可以用笛卡尔树。
具体的,我们以下表为
由上面的性质
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律