李超线段树
概述
-
李超线段树是真正用于维护“线段”的线段树。
-
具体来说,李超线段树主要用于维护平面上线段(表现为给出定义域的一次函数)信息,通常为某处的最大/小值等。
实现原理
-
不妨以加线段,查询 \(l:x=k\) 与所有线段的交点的最大纵坐标为例。
-
众所周知,区间加等差数列,区间求和是容易的。然而区间取 \(\max\) 却难以平凡维护。
-
注意到一次函数有一个非常美妙的性质:(非严格)单调。不妨先将修改区间下放到到达点上,若对应区间仅由一条线段支配,则两者的交点能给我们提供很多有意义的信息。
-
交点在区间外:说明有一者严格优。删去另一者。
-
交点在区间内:此时区间内的答案是一个分段函数。显然线段树并不能很好地处理分段函数——引入标记永久化。
-
-
显然,交点在哪一侧,另一侧就被一个线段完全支配。从而我们可以单侧递归!线段的函数成了永久化的标记,放在任意的节点上,结合标记永久化的查询方式即可。
复杂度分析
- 显然为插入 \(O(\log^2)\),询问 \(O(\log)\)。
例题
P4097 [HEOI2013] Segment
-
题意:插入线段,求与 \(l:x=k\) 交点最大的线段编号。
-
卡精度毒瘤题!虽然没卡到我,但逻辑上讲宽广的斜率范围 \([10^{-9},10^9]\) 应该是随便卡精度。
-
毕竟是板子,不多说了。\(O(n\log^2)\)。
P4254 [JSOI2008] Blue Mary 开公司
-
题意:插入线段,求与 \(l:x=k\) 的最大交点,保留到百位(百位以下舍去)。
-
这就是不卡精度的鉴题目!也是板子,不说了,\(O(n\log^2)\)。
23.2.14 T4 鲍勃打比赛
-
题意:给出序列 \(a_{1\sim n}\),记 \(S\) 为其所有不降子序列的集合,求 \(\max_{s\in S} f(s)\),\(f(s)\) 不太好数学语言化,用自然语言来说是各项权值和+每个未选段的价值,一个长为 \(k\) 的未选段的第 \(j\) 项的价值为 \(-j\)。
-
数据范围:\(n\leqslant 10^5,a\in [-10^9,10^9]\)。
-
本题也见 CDQ 分治。
-
有什么好说的?设计 dp 如下:
-
状态设计:\(f_i\) 表示以 \(i\) 结尾的 LIS 的最大权。
-
初始化:\(f_0=0\)。
-
状态转移:
\[\begin{aligned} f_i & =\max_{j<i \land a_j\leqslant a_i}(f_j-\frac{(i-j)(i-j-1)}{2}+a_i) \\ & =\max_{j<i \land a_j\leqslant a_i}(f_j-\frac{i^2+j^2-2ij-i+j}{2})+a_i \\ & =\max_{j<i \land a_j\leqslant a_i}(ji+f_j-\frac{j^2+j}{2})-\frac{i^2-i}{2}+a_i \end{aligned} \] -
-
这一状态转移是非常明显的斜率式。按 \(a_i\) 升序为第一关键字,\(i\) 升序为第二关键字排序,按这个序转移,将对应的直线插到 \(i+1\sim n\) 上,查询的时候单点查最值即可。记得每个 \(i\)(包括 \(i=0\))都应向终点转移。复杂度就是李超树的 \(O(n\log^2)\),当然每种后缀加各一种我猜有可能可以分析。