李超线段树

『我从来没有会过任何数据结构。』

李超线段树

这玩意是一个可以支持插入直线 \(y=kx+b\),查询 \(x=x_0\)\(y\) 的最值的数据结构。

很简单,我们记 \(f_x\)\(x_0=x\)\(y\) 的最值对应直线的下标。那么对于插入的一条直线 \(p\),在位置 \(x\) 就可以直接分类讨论。假设我们最值是维护的最大值。

那么,对于线段树上一个节点 \(x\) 维护的区间 \([l,r]\),如果 \(f_x\) 对应的 \(y\) 的值比 \(x_0=mid\) 时直线 \(p\) 上面的值要小。说明直线 \(p\) 对于 \(mid\) 要更优。如果这两条直线的斜率 \(k1,k2\)\(k1 <k2\),那么 \([l,mid]\) 中的所有点都应该会是 \(p\) 可能更优。而对于 \((mid,r]\) 中的所有点,\(p\) 只会在一个前缀时更优,因为两条直线会相交。\(k1 \ge k2\) 同理。如果 \(p\) 上面的值比 \(f_x\) 对应的 \(y\) 的值小,那么就是和上面的情况相反。简单地说,就是讨论 \(mid\) 与两条直线交点的相对位置。

为了保证时间复杂度,李超线段树干了这么个事情。对于一个查询的单点 \(x_0\),在线段树上经过了 \(\log V\) 个点,我们对于每个点维护出在 \(mid\) 时候更优的直线是哪条。那么这个查询的点对应的答案就会是这些直线中最优的。因为这些直线对于 \([l,r]\) 中每个点都有可能成为最优的直线。而我们又不能每次下传去 check,所以就可以标记永久化,在每个节点上挂可能更优的直线。

可能有这么个问题,有没有可能答案不在那 \(\log V\) 条直线里面?显然是不可能的,因为如果我们有一条直线比这 \(\log V\) 条直线在 \(x=x_0\) 时候的 \(y\) 值都要大,那么说明这条直线与其它所有直线的交点都在 \(x_0\) 左边,那么一定会有一个节点的 \(mid\) 在某个交点的右边,这样在那个节点上我们不应该不更新更优的直线。然后因为有标记永久化,插入直线的复杂度是 \(O(\log V)\) 的,单点查询的时间复杂度是 \(O(\log V)\) 的。

练习题

Linear Maximization

题意是说每次加一个点 \((x,y)\),然后求所有点 \((x,y)\) 中,\(ax+by\) 的最大值。我们记最大值为 \(val\),那么有:\(ax_i+by_i=val\),两边同时除以 \(b\),有 \(\frac{a}{b}x_i+y_i=\frac{val}{b}\)。我们把 \(x_i\) 看成直线中的 \(k\)\(y_i\) 看成 \(b\)\(\frac{a}{b}=x,\frac{val}{b}=y\)。那么 \(y=kx+b\)。我们需要求 \(y\) 的最大值,那么最后的答案就是 \(y \times b\)。然后就是模板了,相当于每次插入一条直线,然后查询 \(x=x_0\) 时候的最大值。

但是有个问题,\(\frac{a}{b}\) 不一定是整数。那么我们可以尝试通过询问 \(\lfloor\frac{a}{b}\rfloor\)\(\lceil\frac{a}{b}\rceil\) 来得到答案。时间复杂度 \(O(n\log V)\)。注意 \(b=0\) 的情况。

哦,这题 \(b\) 的正负关系有影响。

[SDOI2016]游戏

题意是说每次在一条路径上面加个数,然后维护一个区间的最小值。首先可以树剖。对于 \(s \sim \operatorname{LCA}(s,t)\) 上的一个点 \(x\)\(dis_x=dep_s-dep_x\)。所以它的点权是 \((dep_s-dep_x)\times a+b\),相当于 \(dep_x \times (-a)+(dis_s\times a +b)\)。把 \((-a)\) 看成一条直线的 \(k\)\((dis_s\times a+b)\) 看成 \(b\)。那么就相当于在一段区间里面加入直线了。对于 \(\operatorname{LCA}(s,t)\sim t\) 的点,\(dis_x=dep_s+dep_x-2\times dep_{\operatorname{LCA}(s,t)}\)。同理可以写成 \(dep_x \times a+((dep_s-2\times dep_{\operatorname{LCA}(s,t)})\times a+b)\)

那么现在问题就变成维护区间内插入直线,查询区间内 \(x_0=x\)\(y\) 的最小值的最小值,李超线段树维护。时间复杂度 \(O(n\log^3 n)\)

posted @ 2025-03-07 18:13  harmis_yz  阅读(22)  评论(1)    收藏  举报