历史将由你开|

笛卡尔树学习笔记

定义

笛卡尔数是通过一个序列构造出来的树。满足以下性质:

  1. 是一棵二叉树。
  2. 中序遍历结果是 1n
  3. 对于每一个非根节点,权值大于/小于父亲的权值。

来自 OI Wiki 的一张图。

性质

  1. 任意一条深度单调的路径,权值单调。
  2. 对于任意两点 u<v,满足以 lca(u,v) 为根的子树包含下标 [u,v] 的区间。

构建

维护最右边的一条链,这条链编号和权值都单调,可以把这条链看作单调栈。
从前向后遍历 a 数组,对于每一个 i 执行:
如果 aiastacktop,直接入栈。
否则,一直弹出栈顶直到栈空或者 aiastacktop,入栈,最后一个弹出的栈顶设为 i 的左儿子。

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;
}

应用

  1. RMQ 问题。
  2. 优化 dp。

本文作者:革命军参谋长·萨博

本文链接:https://www.cnblogs.com/zhangjiting/p/18644106

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   革命军参谋长·萨博  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起