李超线段树

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)\)

posted @ 2026-01-14 18:07  Zwi  阅读(0)  评论(0)    收藏  举报