李超线段树 (Li-Chao Segment Tree)
李超线段树,顾名思义,就是线段树的一个变种。说来惭愧,我在ACM生涯第二年才知道这么个东西的存在,所以赶紧写博客交学费。
李超线段树是一种用于维护平面直角坐标系内线段关系的数据结构。它常被用来处理这样一种形式的问题:给定一个平面直角坐标系,支持动态插入一条线段,询问从某一个位置 向下看能看到的最高的一条线段(也就是给一条竖线,问这条竖线与所有线段的最高的交点。
如上图,有三条线段,两条红色竖线代表两个询问,则点 与点
就是询问到的答案。
李超线段树的核心是维护每个区间的“最优势线段”,即在每个区间的中点处最高的线段。询问时我们可以对所有包含横坐标为 的位置的区间上的最优势线段计算答案,最后取个
。
其实这就相当于维护一个记录当前区间最高线段的,不下传标记的线段树。(显然如果我们访问到的区间内只包含询问的横坐标,那么这个区间的最优势线段就是答案线段,所以这样统计包含答案是能保证正确性的)
如上图,对于区间[0,8][0,8],绿色线段是“最优势线段”
对于修改,我们先把线段的值域分割到线段树的区间上,每次访问一个完整的包含在线段值域中的区间时:
1. 若当前区间还没有记录最优势线段,则记录最优势线段并返回。
2. 若当前区间的最优势线段被插入的线段完全覆盖,则把最优势线段修改为被插入线段并返回。
3. 若当前区间的最优势线段把被插入线断完全覆盖,则直接返回。
4. 若当前区间最优势线段与被插入线段有交,则先判断哪条线段在当前区间更优,并把更劣的线段下传到交点所在子区间。(交点两边的部分被这两条线段分别控制,而我们已经让在中点更优的那条线段作为区间最优势线段,因此更劣的那条线段只有可能在交点所在子区间超过当前区间的最优势线段)
下面一起来剖析一下代码。
线段树主体部分:(#define lson curpos<<1 #define rson curpos<<1|1 代码里忘记写了)
建树:
插入线段:
查询:
复杂度分析:
修改部分:我们每次把一条线段的值域分隔到O(logn)个区间,每个区间最多把标记下传O(logn)层,因此修改的时间复杂度为O(log2n)。(但实测常数很小)
查询部分:每次在线段树上从上到下扫一遍,时间复杂度为O(logn)。
给出一道李超线段树裸题,bzoj1568 (https://lydsy.com/JudgeOnline/problem.php?id=1568)

其他相关题目:
bzoj 3938 4515
Reference:
算法|李超线段树初步(算法讲解+例题):https://ac.nowcoder.com/discuss/180365
__EOF__

本文链接:https://www.cnblogs.com/JHSeng/p/10896570.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构