李超线段树

概述

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

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

实现原理

  • 不妨以加线段,查询 l:x=k 与所有线段的交点的最大纵坐标为例。

  • 众所周知,区间加等差数列,区间求和是容易的。然而区间取 max 却难以平凡维护。

  • 注意到一次函数有一个非常美妙的性质:(非严格)单调。不妨先将修改区间下放到到达点上,若对应区间仅由一条线段支配,则两者的交点能给我们提供很多有意义的信息。

    • 交点在区间外:说明有一者严格优。删去另一者。

    • 交点在区间内:此时区间内的答案是一个分段函数。显然线段树并不能很好地处理分段函数——引入标记永久化。

  • 显然,交点在哪一侧,另一侧就被一个线段完全支配。从而我们可以单侧递归!线段的函数成了永久化的标记,放在任意的节点上,结合标记永久化的查询方式即可。

复杂度分析

  • 显然为插入 O(log2),询问 O(log)

例题

P4097 [HEOI2013] Segment

  • 题意:插入线段,求与 l:x=k 交点最大的线段编号。

  • 卡精度毒瘤题!虽然没卡到我,但逻辑上讲宽广的斜率范围 [109,109] 应该是随便卡精度。

  • 毕竟是板子,不多说了。O(nlog2)

P4254 [JSOI2008] Blue Mary 开公司

  • 题意:插入线段,求与 l:x=k 的最大交点,保留到百位(百位以下舍去)。

  • 这就是不卡精度的鉴题目!也是板子,不说了,O(nlog2)

23.2.14 T4 鲍勃打比赛

  • 题意:给出序列 a1n,记 S 为其所有不降子序列的集合,求 maxsSf(s)f(s) 不太好数学语言化,用自然语言来说是各项权值和+每个未选段的价值,一个长为 k 的未选段的第 j 项的价值为 j

  • 数据范围:n105,a[109,109]

  • 本题也见 CDQ 分治。

  • 有什么好说的?设计 dp 如下:

    • 状态设计:fi 表示以 i 结尾的 LIS 的最大权。

    • 初始化:f0=0

    • 状态转移:

    fi=maxj<iajai(fj(ij)(ij1)2+ai)=maxj<iajai(fji2+j22iji+j2)+ai=maxj<iajai(ji+fjj2+j2)i2i2+ai

  • 这一状态转移是非常明显的斜率式。按 ai 升序为第一关键字,i 升序为第二关键字排序,按这个序转移,将对应的直线插到 i+1n 上,查询的时候单点查最值即可。记得每个 i(包括 i=0)都应向终点转移。复杂度就是李超树的 O(nlog2),当然每种后缀加各一种我猜有可能可以分析。

posted @   未欣  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示