李超线段树

概述

  • 李超线段树是真正用于维护“线段”的线段树。

  • 具体来说,李超线段树主要用于维护平面上线段(表现为给出定义域的一次函数)信息,通常为某处的最大/小值等。

实现原理

  • 不妨以加线段,查询 \(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)\),当然每种后缀加各一种我猜有可能可以分析。

posted @ 2023-02-22 17:07  未欣  阅读(56)  评论(0编辑  收藏  举报