李超线段树
posted on 2024-11-02 06:33:16 | under | source
做斜优时碰到的,顺便记一下。
应用场景
平面直角坐标系上有若干条线段,求 \(x=k\) 与这些线段的交点的纵坐标的最值,也就是求某个值的函数最值。
李超线段树可以支持 \(O(\log^2 n)\) 新增线段,\(O(\log n)\) 查询。
修改
以求最大值为例,先考虑加入的线段非常长(就是直线)。
考虑建一棵线段树,树上一点对应一区间,然后维护区间的“优势线段”,定义为取得区间中点最值的线段。这有啥用?用来保证时间复杂度。
现在考虑新增一条线段 \(l:y=kx+b\),它要更新区间 \([l,r]\),原来的优势线段是 \(l_2\)。
假如 \(l\) 在 \(mid\) 的取值较小,那么容易发现,\(l\) 必然在 \([l,mid]\) 或 \([mid+1,r]\) 中完全劣于 \(l_2\),此时去更新可能更优的区间即可。
假如 \(l_2\) 在 \(mid\) 的取值较小怎么办?只需要让 \(l\) 成为 \([l,r]\) 的优势线段,然后把 \(l_2\) 当成来更新的线段,当成上面的情况处理即可。
为什么是对的?实际上,这相当于做了个标记永久化,\([l,r]\) 真正的优势线段是其祖先链上最大的“优势线段”,这里“优势线段”是指我们存储的而非实际的。
这样的话,就是让 \(l_2\) 强行成为 \([l,r]\) 的“优势线段”,但是 \(l\) 可能在左右某个区间更优,所以我们递归下去就好。
复杂度 \(O(\log n)\),假如加的是线段,那么还要划分为若干区间,复杂度 \(O(\log^2 n)\)。
查询
非常简单,在对应节点祖先链上求个最值即可。不能只看该点的优势线段是因为标记永久化了。复杂度 \(O(\log n)\)。

浙公网安备 33010602011771号