吉司机线段树(Segment Tree Beats!)复杂度分析

这是原论文中证明的简化版本,但不失其正确性。

mxx\newcommand\mx{\text{mx}}\mx_xxx 子树中最大值,smxx\newcommand\smx{\text{smx}}\smx_xxx 子树中严格次大值,fa(x)\newcommand\fa{\operatorname{fa}}\fa(x)xx 的父亲。称节点 xx关键点,当且仅当 xx 是根节点,或 mxfa(x)mxx\mx_{\fa(x)}\neq \mx_x。设变量 Φ\Phi 表示目前线段树上关键点个数。

不难说明,smxx\smx_xmxy\mx_y 的最大值,其中 yy 取遍 xx 的子树(不含它自身)中所有关键点。那么,我们对区间 [l,r][l,r]aimin{ai,c}a_i\leftarrow \min\{a_i,c\},在线段树上 DFS 暴力更新节点信息时,递归访问 xx 子树的充分必要条件就变成“xx 所辖区间是 [l,r][l,r] 子区间,且 xx 的子树(不含它自身)中存在至少一个关键点 yy,满足 mxyc\mx_y\geq c”。而 DFS 遍历过的所有节点 yy,在此后都将满足 mxy=c\mx_y=c,变成非关键点。故设 DFS 过程中访问(并消除)了 kk 个关键点,我们至少访问了这 kk 个关键点到 DFS 起始节点的路径并,节点总数为 O(klogn)\newcommand\bigO{\operatorname{O}}\bigO(k\log n)(由 k+k/2+k/4+2kk+k/2+k/4+\cdots\leq 2k,当 kk 足够大时,复杂度为 o(k)\operatorname{o}(k));而由上文可得,我们不会递归路径并以外节点的子树。故而我们以 O(klogn)\bigO(k\log n) 的时间使得 Φ\Phi 减少了 kk

所以当 Φ\Phi 的总变化次数为 mm 时,总时间复杂度为 O(mlogn)\bigO(m\log n)。若不带修改,则 mnm\leq n,总复杂度为 O(nlogn)\bigO(n\log n);大多数类型的单点修改会使得 ΦΦ+O(logn)\Phi\leftarrow\Phi+\bigO(\log n),故总复杂度为 O(nlog2n)\bigO(n\log^2 n)

  • 2023年1月23日