摊还:笛卡尔树的必要分裂、合并、按值新增的复杂度分析
为方便描述,不妨默认所有笛卡尔树均为大根。
1)笛卡尔分裂
笛卡尔树分裂修改的边是 \(O(n)\) 级别的,把边都上到线段树上即可 \(O(n\log n)\) 维护。
上界证明:我们不妨设势能函数为 \(\phi = |E|\),其中 \(E\) 被定义为包含所有不为最左链和最右链的边集(前后缀max)。显然 Split 时,这个边集只会减不会增,踢出去的边的数量和切断的边的数量是同级的,故正确。
下界构造:可以直接把这玩意切成一个一个的点,就能卡到 O(n) ,这是平凡的。
2)笛卡尔树合并
是分裂的逆过程,分析方式完全相同。
3)笛卡尔树按值新增
详细描述:大根笛卡尔树值域从小到大新增节点,在任意pos插入,边的变化总数是 $ O(n\log n) $ 级别的。直接把边上到线段树上面维护是 \(O(nlog^2 n)\) 的。
上界证明:我们假装是底部加入一个点,再让这个点浮上去,发现这个过程有点像 Splay ,但是并不是。但是我们可以用同一个是能函数分析。
我们考虑势能函数 \(\phi = \sum\limits_{i=1}^{n} \log sz_i\) ,我们把修改的所有边涉及到的边的两个点拿出来假装拉成一条链(实际上相邻的点不一定想相邻),我们定义只属于这个点。但不属于他链上的后继的重量为这个链上的点的重量。
我们考察一下势能的变化,我们发现如果一个点的重量特别大,但是他后继重量和小,修改完它的变化是即为细微的,这是我们不希望看见的,但是我们可以定义一下什么叫“特别大”,把这种情况排斥掉。如果一个点的重量大于所有后继重量的和,这个点我们就不考虑,单独计算他的复杂度,这样的点至多只有 \(\log n\) 个,因为每次遇到这样的点后缀和就会翻倍。
我们再考察剩下的点,我们发现相邻两个点就一定有一个后继 sz 折半,这个时候我们的 \(\log sz\) 就减少了一个常数,我们的分析就正确了。
下界构造:一个直接的构造是随机化,然后证明其期望就是 \(O(n\log n)\) 的,由于期望已经有 \(O(n\log n)\) 了,所以最大的构造也能达到 \(O(n\log n)\) ,直接硬构造也是可以的。
29/10/24 upd : 考虑对笛卡尔树轻重剖分,轻链显然正确,重链交错配对分析即可。
14/04/25 upd:
发现了这个问题和 https://www.luogu.com.cn/problem/P8078 秃子酋长之间的深刻联系。
秃子酋长这个问题实际上可以做到 nlog^2n + qlogn 是因为他可以写成 nlogn 个矩形加,q次单点查的形式。
我们把秃子酋长的绝对值拆开,只关心一个数的前驱在它前面还是后面的时候,它是正号还是负号。我们只考虑小于 ai 的数字,从 i 往前看的前缀 max 和从 i 往后看的后缀 max,实质上我们建立比 ai 小的数字的笛卡尔树,加入 ai 时 cut 掉的边的数量就是切换的次数,也就是 nlogn 级别的。
以及我们实际上可以反过来使用秃子酋长来证明这个东西的复杂度是正确的。但是这样绕太远了,我们尝试直接在这个问题上实践一下猫树分治。
直接使用猫树分治,我们定义猫树的叶子节点的势能是 1,里叶子越远势能越大。
我们在 cut 边的时候对笛卡尔树上的边做交错配对分析两个边必有一个会被扔到更低的猫树节点上。
(此时这个分析和树剖本质相同)
树剖也可以用来分析 splay!组合化的证明,大大简化了阴间的诡异 log 放缩。

浙公网安备 33010602011771号