[Резюме] 广义李超线段树
前言
“李超线段树,简称李超树。它支持插入 直线 或 线段,并查询某个横坐标处的 最值。”
本文以最大值为例,讨论定义域单位为 \(\delta\) 的广义李超线段树(即 \(\delta\mid \forall x\) ,例如整数时 \(\delta=1\),实数时 \(\delta=\text{eps}\)),与传统的李超线段树不同,它插入的是 函数 而非直线或线段,但为了保证正确的时间复杂度,对函数有较严格限制,见条件。
注意:
-
定义 \(V\) 为总定义域,\(F\) 为函数集合,\(N=|F|\);
-
本文仅讨论 \(V\subseteq\mathbb{Z}\) 的情况,可能以后会讨论广义李超线段树向实数的扩展。
-
本文讨论的所有“区间”都是线段树节点;
-
定义线段树上从 \([1,V]\) 到 \([k,k]\) 的路径为 \(\text{Path}\);
-
本文假定计算 \(\forall \phi \in F\) 的时间复杂度均为 \(O(1)\);
-
不展开讨论导数无穷时的处理方法,一般取端点;
-
不展开讨论区间中点不是整数的处理方法。
正文
广义李超线段树可以 在线 解决下述问题:添加 函数 \(f_i\) 或给定 \(x\) 求 \(\max\{f_i(x)\}\).
-
考虑朴素线段树:
-
对每一个区间记录定义域完全覆盖 \([l_i,r_i]\) 的所有函数编号,只下传定义域不完全覆盖区间的函数,时间复杂度 \(O(\log V)\)。
-
\(1\) 个函数最多占 \(\log V\) 个区间,故空间复杂度 \(O(N\log V)\).
-
对于每一次查询 \(x=k\),处理出 \(\text{Path}\) 上共 \(O(\log V)\) 个区间里所有函数的值,取最大就是结果。唯一麻烦的是,\(\text{Path}\) 上的函数数量最大是 \(N\),时间复杂度 \(O(NQ)\)。
-
李超线段树的核心思想是维护 区间优势函数,及时排除区间绝对劣势函数,将单次需枚举的函数数量减少至 \(O(\log V)\);实现时,维护 \(\text{tag}_i\) 表示 \([l_i,r_i]\) 的优势函数编号,即定义域完全覆盖 \([l_i,r_i]\) 并且在 \(m_i=\dfrac{l_i+r_i}{2}\) 处 取值最大 的函数。
条件
令 \(\delta\mid x\),\(\forall f,g\in F,f\ne g:\)
定义区间 \((l,r)\),有 \((l,r)\subseteq D_f,(l,r)\subseteq D_g\),其中 \(D_\phi\) 是函数 \(\phi\) 的定义域;
-
只能存在 \(\le 1\) 个极长区间 \((l,r)\),\(\forall x\in(l,r),f(x)=g(x)\land2\mid([f(l)>g(l)]+[f(r)<g(r)])\);
-
不存在 \(r-l>2\delta\) 的区间 \((l,r)\),\(\forall x\in(l,r),f(x)=g(x)\land2\mid([f(l)>g(l)]+[f(r)>g(r)])\);
解释说明:
-
确保任意两个函数严格大小交换最多有一次;
-
确保任意两个函数不存在连续多个不发生严格大小交换的重合点;
第二点不是必要条件,当且仅当以上第二点为否时,有其他性质可以快速确定该区间左右两端有无大小交换。
满足条件的 \(F\) 可以被广义李超线段树维护。
特别地,切点:\(P_t=\{(a,f(a))\mid f(a)=g(a)\land2\mid[f(a+\delta)>g(a+\delta)]+[f(a-\delta)>g(a-\delta)]\}\)。这个判定有助于快速确定相对优势函数和绝对劣势函数:本文定义 \((a,f(a))\in P_t,[f(a+\delta)>g(a+\delta)]+[f(a-\delta)>g(a-\delta)]=2\) 是 \(f\) 关于 \(g\) 的 “上切点”;在实现时,\((a,f(a))\) 是关于 \(g\) 的上切点表明此时 \(f\) 较 \(g\) 更优。类似地,定义 \(f\) 关于 \(g\) 的 “下切点” \((a,f(a))\in P_t,[f(a+\delta)>g(a+\delta)]+[f(a-\delta)>g(a-\delta)]=0\)。
过程
-
考虑区间 \([l_i,r_i]:\)
-
去除区间绝对劣势函数 \(f_{\text{bad}}:\forall x\in[l_i,r_i],f_{\text{bad}}(x)\le f_{\text{tag}_i}(x)\),其一定不是 \(x\in [l_i,r_i]\) 的答案;
-
保留优势函数 \(f_{\text{tag}_i}:\forall \phi,f_{\text{tag}_i}(m_i)\ge \phi(m_i)\) 不下放;
-
下放相对优势函数 \(f_{\text{good}}:\exists x\in[l_i,r_i],f_{\text{good}}(x)>f_{\text{tag}_i}(x)\) 至子区间,条件保证其在某一子区间处于绝对劣势。
-
以上是插入新函数区间所做的事,时间复杂度 \(O(\log V)\).
-
考虑整体:
-
叶子节点 \([k,k]\) 的函数,除区间优势函数都是区间绝对劣势函数;
-
非叶子节点的函数,除区间优势函数和区间绝对劣势函数,都下放直至成为区间优势函数或区间绝对劣势函数;
-
最终,区间相对优势函数不会存在,即所有函数不是区间绝对劣势函数就是区间优势函数。
-
查询 \(k\):在所有经过 \(x=k\) 的函数(即朴素算法里,\(\text{Path}\) 上所有节点记录的所有函数)中排除所有区间绝对劣势函数后,剩下的函数(只有区间优势函数)都有可能成为答案;一个区间只有一个优势函数,所以时间复杂度 \(|Path|=O(\log V)\).
实现
定义 \(f,g\in F\),\(f\) 在 \(x=a\) 比 \(g\) 更优,当且仅当 \(f(m)>g(m)\) 或 \((a,f(a))\) 符合 \(f\) 关于 \(g\) 的上切点判定。类似地定义 \(f,g\in F\),\(f\) 在 \(x=a\) 比 \(g\) 更劣,当且仅当 \(f(m)<g(m)\) 或 \((a,f(a))\) 符合 \(f\) 关于 \(g\) 的下切点判定。
不考虑定义域,插入函数 \(f_j\),设当前区间为 \([l_i,r_i]\),中点为 \(m_i\)。若 \(f_j\) 在 \(x=m_i\) 比 \(f_{\text{tag}_j}\) 更优,则交换 \(\text{tag}_i\) 和 \(j\)。
此时 \(f_j\) 在 \(x=m_i\) 比 \(f_{\text{tag}_j}\) 更劣;
若 \(f_j\) 在 \(x=l\) 比 \(f_{\text{tag}_j}\) 更优,则 \(f_j,f_{\text{tag}_i}\) 大小关系交换发生在 \((l_i,m_i]\),向 \([l_i,m_i]\) 递归插入 \(f_j\);
若 \(f_j\) 在 \(x=r\) 比 \(f_{\text{tag}_j}\) 更优,则 \(f_j,f_{\text{tag}_i}\) 大小关系交换发生在 \([m_i,r_i)\),向 \((m_i,r_i]\) 递归插入 \(f_j\);
否则,\(f_j\) 在该区间处于绝对劣势,舍去。
根据条件,因为最多有一次大小交换,所以两个分支至多进入一个,因此时间复杂度 \(O(\log V)\);
考虑定义域在线段树上投射 \(O(\log V)^{[1]}\) 个节点,所以定义域限定的修改时间复杂度为 \(O(\log^2 V)\).
查询 \(x=k\) 的答案,有 \(\text{ans}=\max\limits_{i\in\text{Path}} f_{\text{tag}_i}(k)\),时间复杂度 \(|Path|=O(\log V)\).
引用
Alex_Wei 的 线段树合集 \(\text{Section}\) 李超线段树。
Hanghang007 和佚名的 广义李超线段树。
注释
任意两个函数间图像只有一个交点不是 \(F\) 能被李超线段树维护的必要条件,反例见下,具体请参考“条件”。

\(f(x)=x^3+3x^2\) 和 \(g(x)=4\) 的图像。
由于保证 \(F\) 满足“条件”以构造随机函数比较困难,所以广义李超线段树更常见地维护题目给出的近似线性或具有良好性质的函数。
\([1]:\) 定义域在线段树一层上最多投射两个区间,其形式只能为:同层两个非兄弟区间,其间间隔零或多个叔祖区间。

李超线段树,简称李超树。它支持插入 **直线** 或 **线段**,并查询某个横坐标处的 **最值**。
本文以最大值为例,讨论整数域的广义李超线段树,与传统的李超线段树不同,它插入的是 **函数** 而非直线或线段,但为了保证正确的时间复杂度,对函数有较严格限制。
浙公网安备 33010602011771号