笛卡尔树复习笔记

假设 \(x\)\(y\) 均为排列。

每个结点有一个二元组 \((x,y)\),笛卡尔树满足只关注 \(x\) 它是一棵二叉搜索树,只关注 \(y\) 它是一个堆。

\(l_i\) 表示 \(i\) 结点的左儿子,\(r_i\) 表示 \(i\) 结点的右儿子,如果是小根堆,即 \(x_{l_i}<x_i,x_i<x_{r_i}\) 是第一个条件,\(y_i<y_{l_i},y_i<y_{r_i}\) 是第二个条件。

怎么构建笛卡尔树呢?将二元组按 \(x\) 从小到大排序一个一个插入,发现要满足 \(x\) 的条件,就得保证当前这个二元组能从新树的根一直往右儿子走走到。

用栈维护从根开始一直往右儿子走直到不存在右儿子的这样一条链的 \(y\) 值。显然,栈中的 \(y\) 单调递增。

当插入 \((x_i,y_i)\) 时,向上找到第一个 \(y_j<y_i\) 的结点 \(j\),将 \(i\) 接到 \(j\) 的右儿子处。

如果 \(j\) 原先就有右儿子 \(k\) 的话,就将 \(k\) 接到 \(i\) 的左儿子处,显然这是合法的。

可以发现,因为每步操作都是唯一的,所以最终的笛卡尔树也是唯一的。


笛卡尔树有什么性质?

  • 它的中序遍历是原序列。
  • 如果每个结点的 \(y'\) 取其子树内的最值,那么以 \(x\) 为下标的序列上 \(y\) 的 RMQ 是笛卡尔树上 LCA 处的 \(y'\)
posted @ 2021-05-01 16:38  Biadocy  阅读(50)  评论(0编辑  收藏  举报