笛卡尔树
高思诚是后门中学的学生。
\(\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\) 的左儿子。
其满足二叉搜索树与堆的性质。
用单调栈维护右链。还是简单易懂的,结合这个食用。
- 求直方图的最大子矩阵。
不准用悬线法!
构建大根的笛卡尔树。
答案是
\(siz\) 是笛卡尔树中子树大小。\(siz_x\) 就是合法的最大子区间。
时间复杂度 \(O(n)\).
以下标 \(i\rightarrow w'\),键值 \(k\rightarrow k'\) 建立笛卡尔树。
求插入序列字典序最小的 \(\{i\}\) 的键值 \(\{k\}\).
下标 \(i\) 满足的是堆性质。
对其进行先序遍历输出节点的 \(k\) 值即可。比较抽象可以感性理解。
泥嚎?
区间 \(\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\) 个。
合并儿子与自己。
令 \(H=h_x-h_{fa_x}\),\(S=siz_x\).
答案 \(f_{rt,k}\).
长得有点像我们 \(\rm GJOJ\) 的组合数哈。
讲的有点答辩了。
卢一奇同学在 \(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\) 结尾的区间贡献。
记 \(gr,gl\) 为前缀/后缀和。
左边:
右边:
时间 \(O(q\log n)\),可以认为 \(\log\) 是一个小常数。
为什么不能多次分治?不知道。
整题柿子之后再理解一下。
Special Segments of Permutation
求
枚举最大值,可以配合单调栈启发式合并进行数点。
笛卡尔树同理。很好理解。
时间复杂度 \(O(n\log^2 n)\).
后记
讲完了开银趴。
明天走了。
参考文献:Here