笛卡尔树,与其说是一种数据结构,不如说是一个简单的思想:
比如说我对一个序列上的任意一个区间 $[l,r]$ 都有某种约束。 而选中一个点 $x$,这些区间就能划分成下面三类:
上面所说的某种约束,一般是和区间最值相关的东西。 和常规的均分分治相比,为了保证时间复杂度,对于信息的合并,一般也会更为特殊。
实际上最值分治不仅仅是可以作用于序列。对于无根树,我也可以每次选取最小值作为根,然后以此将问题分裂成它的若干个子树的问题。
序列可以看成是一条链,所以也可以说是树的特例。
显式建出这样一棵树,考虑这样的算法:
时间复杂度?
这棵树其实还有一些其它的作用。
对于 $n$ 个大小为 $1$ 的集合。考虑它们的两两合并,记大小为 $x\le y$。 如果每次合并能用 $O(x)$ 的复杂度完成,则直到它们完全合并, 总合并时间也不会超过 $O(n \log n)$。
如果需要借助一点数据结构来合并信息,如可能需要 $O(x\cdot f(n))$ 合并,也只不过是 $O(n\log n\cdot f(n))$。 一般 $f(n) = O(\log n)$。
特例:根据树的结构合并它们。