这是原论文中证明的简化版本,但不失其正确性。
记 mxx 为 x 子树中最大值,smxx 为 x 子树中严格次大值,fa(x) 为 x 的父亲。称节点 x 为关键点,当且仅当 x 是根节点,或 mxfa(x)=mxx。设变量 Φ 表示目前线段树上关键点个数。
不难说明,smxx 是 mxy 的最大值,其中 y 取遍 x 的子树(不含它自身)中所有关键点。那么,我们对区间 [l,r] 取 ai←min{ai,c},在线段树上 DFS 暴力更新节点信息时,递归访问 x 子树的充分必要条件就变成“x 所辖区间是 [l,r] 子区间,且 x 的子树(不含它自身)中存在至少一个关键点 y,满足 mxy≥c”。而 DFS 遍历过的所有节点 y,在此后都将满足 mxy=c,变成非关键点。故设 DFS 过程中访问(并消除)了 k 个关键点,我们至少访问了这 k 个关键点到 DFS 起始节点的路径并,节点总数为 O(klogn)(由 k+k/2+k/4+⋯≤2k,当 k 足够大时,复杂度为 o(k));而由上文可得,我们不会递归路径并以外节点的子树。故而我们以 O(klogn) 的时间使得 Φ 减少了 k。
所以当 Φ 的总变化次数为 m 时,总时间复杂度为 O(mlogn)。若不带修改,则 m≤n,总复杂度为 O(nlogn);大多数类型的单点修改会使得 Φ←Φ+O(logn),故总复杂度为 O(nlog2n)。
2 Responses
[…] 执行该过程时恰当维护区间和,后两种操作就是平凡的。应用势能分析可以得到 O(mlog2n)bigO(mlog^2 n)O(mlog2n) 的复杂度上限,已经相当优秀了。 […]
[…] 以上任意性质不满足,都可能导致复杂度分析与“常规”线段树不同:例如 Segment Tree Beats! (区间取最值,不满足×times× 对 +++ 的分配律),对其运用势能分析才得出正确的复杂度。其他所有能维护的信息都可用上述模型解释,无出其右。 […]