笛卡尔树学习笔记
定义
笛卡尔数是通过一个序列构造出来的树。满足以下性质:
- 是一棵二叉树。
- 中序遍历结果是
。 - 对于每一个非根节点,权值大于/小于父亲的权值。
来自 OI Wiki 的一张图。
性质
- 任意一条深度单调的路径,权值单调。
- 对于任意两点
,满足以 为根的子树包含下标 的区间。
构建
维护最右边的一条链,这条链编号和权值都单调,可以把这条链看作单调栈。
从前向后遍历
如果
否则,一直弹出栈顶直到栈空或者
for(int i=1;i<=n;i++){ int top=tot; while(top&&v[st[top]]>v[i]) top--; if(top) rc[st[top]]=i; if(top<tot) lc[i]=st[top+1]; st[tot=++top]=i; }
应用
- RMQ 问题。
- 优化 dp。
本文作者:革命军参谋长·萨博
本文链接:https://www.cnblogs.com/zhangjiting/p/18644106
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步