笛卡尔树

高思诚是后门中学的学生。

\(\text{On 2023.5.31}\).


笛卡尔树是一种与堆、平衡树相关的DS。

其为一颗二叉树,每个节点有值 \((k,w)\).

\(k\) 满足二叉搜索树的性质,\(w\) 满足堆的性质。

  • \(\forall w_{son}<w_{father}\)(或大于)

  • \(\forall k_{lson}<k_{father},k_{rson}>k_{father}\).

  • 两个节点 \(u,v\)\(\rm lca\) 的权值为区间 \(\lbrack u,v\rbrack\) 的极值。


构建小根堆。\(k\) 为下标。

维护根节点向右走构成的链。

设当前点为 \(x\),找到第一个 \(w_x>w_u\),令 \(u\)\(fa_x\) 的右儿子,\(x\)\(u\) 的左儿子。

其满足二叉搜索树与堆的性质。

用单调栈维护右链。还是简单易懂的,结合这个食用。


  • 求直方图的最大子矩阵。

不准用悬线法!

构建大根的笛卡尔树。

答案是

\[\max_x w_x\cdot siz_x \]

\(siz\) 是笛卡尔树中子树大小。\(siz_x\) 就是合法的最大子区间。

时间复杂度 \(O(n)\).


P1377 [TJOI2011] 树的序

以下标 \(i\rightarrow w'\),键值 \(k\rightarrow k'\) 建立笛卡尔树。

求插入序列字典序最小的 \(\{i\}\) 的键值 \(\{k\}\).

下标 \(i\) 满足的是堆性质。

对其进行先序遍历输出节点的 \(k\) 值即可。比较抽象可以感性理解。


P3793 由乃救爷爷

泥嚎?

区间 \(\rm RMQ\),数列随机。

n,m=20000000,5s.

从根节点开始搜索 \(\rm lca\),在笛卡尔树上往下跳,找到第一个节点编号在 \(\lbrack l,r\rbrack\) 间。

\(r<a_{rt}\) 往左,\(l>a_{rt}\) 往右。

单次复杂度 \(O(\log n)\)


已知数列 \(A,B\) 同构即对于任意子区间他们的 \(\rm RMQ\) 位置相同。

已知 \(A\)\(B_i\in \mathbb R\cap\lbrack 0,1)\).

若同构有贡献 \(\large w_B=\sum B_i\).

意思是笛卡尔树同构。

子树同构的概率是 \(\large\frac{1}{siz}\). 我认为他说的是 \(\rm RMQ\) 位置相同的概率。

若无限制,\(w_B\) 的期望为 \(\large\frac{n}{2}\).

答案是 \(\large \frac{2}{n}\cdot\prod siz_u\).


P6453 [COCI2008-2009#4] PERIODNI

求在直方图中选出 \(k\) 个车不攻击的方案数。

\(1\le n,k\le 500\)\(h_i\le 10^6\).

按矩形高建立笛卡尔树。

节点 \(x\) 代表的矩形长 \(siz_x\),宽 \(h_x-h_{fa_x}\).

\(f_{u,j}\) 为子树 \(u\) 子树选择 \(j\) 个的方案。

\(son_x\)\(x\) 的贡献用树上背包解决。

\(g_{u,j}\) 为左右儿子共选 \(j\) 个。

\[g_{u,j}=\sum f_{ls,o}\cdot f_{rs,j-o} \]

合并儿子与自己。

\(H=h_x-h_{fa_x}\)\(S=siz_x\).

\[f_{u,j}=\sum g_{u,o}\binom{S-o}{j-o}\binom{H}{j-o}(j-o)! \]

答案 \(f_{rt,k}\).

长得有点像我们 \(\rm GJOJ\) 的组合数哈。

讲的有点答辩了。


P3246 [HNOI2016]序列

卢一奇同学在 \(10\rm min\) 前使用奇怪莫队二次离线开了根号空间喜提 \(\rm MLE\).

节目效果拉满,难绷。

求区间的所有子区间的最小值之和。\(n\le 10^5\).

一个点的贡献是它表示区间的所有子区间!

单次分治。记 \(\lbrack L,R\rbrack\)\(\min\)\(p\)

横跨的子区间的贡献是 \(a_p\cdot (p-L+1)\cdot(R-p+1)\).

剩余区间不能再次分治。

预处理 \(pre_i,suf_i\) 表示向前/后第一个比 \(a_i\) 小的位置。这个东西是笛卡尔树的节点覆盖区间。

处理 \(fr_i,fl_i\) 为向右/左递推,以 \(i\) 结尾的区间贡献。

\[fr_i=fr_{pre_i}+(i-pre_i)a_i \]

\[fl_i=fl_{suf_i}+(suf_i-i)a_i \]

\(gr,gl\) 为前缀/后缀和。

左边:

\[gr_R-gr_p=fr_p\cdot(R-p) \]

右边:

\[gl_{L}-gl_p=fl_p\cdot(p-L) \]

时间 \(O(q\log n)\),可以认为 \(\log\) 是一个小常数。

为什么不能多次分治?不知道。

整题柿子之后再理解一下。


Special Segments of Permutation

\[\sum_{l\le r}\lbrack a_l+a_r=\max_{i=l}^{r}a_i\rbrack \]

枚举最大值,可以配合单调栈启发式合并进行数点。

笛卡尔树同理。很好理解。

时间复杂度 \(O(n\log^2 n)\).


后记

讲完了开银趴。

明天走了。

参考文献:Here

posted @ 2023-08-06 20:05  SError  阅读(10)  评论(0编辑  收藏  举报