首页 > 其他分享 >李超线段树学习笔记

李超线段树学习笔记

时间:2022-08-18 21:23:56浏览次数:88  
标签:线段 李超 笔记 交点 区间 最优 id

这个hack数据是真的强。

模板题的题解很重要哦,希望你能找到适合自己的。

博客食用更佳哦

李超线段树的定义

对于李超线段树的定义,JHSeng大佬的定义简洁精炼:

李超线段树是一种用于维护平面直角坐标系内线段关系的数据结构。

洛谷P4097Segment就是李超线段树维护的板子题了。

题目大意(偷个懒):

要求在平面直角坐标系下维护两个操作:

1. 在平面上加入一条线段。记第 $i$ 条被插入的线段的标号为 $i$。

2. 给定一个数 $k$,询问与直线 $x = k$ 相交的线段中,交点纵坐标最大的线段的编号。

具体维护操作

我们主要维护区间内最优线段

我们假设平面内已有一条线段:

这时显然,其为所有区间内的最优线段,接下来我们再插入一条线段。

明显可以看出,插入新的线段后,两条线段的交点左区间最优线段为新线段,而交点右边区间最优线段则为原来的线段。扫一遍肯定来不及,所以我们二分递归求出所有区间的最优线段。

首先先取当前处理区间的 \(mid\),如果新线段在 \(x=mid\) 时纵坐标更大,则先将当前区间的最优线段更替为新线段,从这里可以看出,每一个区间长度大于一的区间存的线段,只满足取区间内大部分横坐标其为最优解。

if(f[i](mid)-f[id](mid)>eps) swap(i,id);

红色线段为最优线段。

但是实际上交点右边的区间最优线段不是它,所以我们要两条线段再次进行比较,比较区间的左右两端点(即是判断区间内两条线段是否有交点,有交点说明要重新更新)。

如果被淘汰的线段在左右端点的比较中胜出,则将它继续递归,更新。

if(f[i](l)-f[id](l)>eps||(f[i](l)==f[id](l)&&i<id)) upd(lson,ql,qr,i);
if(f[i](r)-f[id](r)>eps||(f[i](r)==f[id](r)&&i<id)) upd(rson,ql,qr,i);

最后得出所有区间的最优线段。

询问的时候单点询问,递归取 max 即可。

一个蒟蒻入坑过的小问题

蒟蒻在第一次写李超线段树的时候,非常不明白询问的时候为什么要取 max。单点询问直接取当前点的最优线段不久行了,在经过思考后,发现:

  1. 李超线段树没有或者说不需要 push_down 操作,所以可能当前点并没有值。

  2. 李超线段树大区间和小区间内存的都不一定是最优线段,大区间刚刚讲过了,只是满足大部分,而小区间由于没有 push_down 也可能出现存的不是最优解,例如如图所示的情况。

当前询问 \(x\) 点的最高纵坐标,假如第二条直线时,一二条直线右边区间的最优线段变为了图中粉色区间,而再加入第三条线段时,更新最优线段后,由于被淘汰的线段在中间和右边都比不过新线段,所以图示粉色区间并没有被递归更新,造成了小区间非最优解的情况。

code

标签:线段,李超,笔记,交点,区间,最优,id
From: https://www.cnblogs.com/windseekerblog/p/16600139.html

相关文章

  • 2022-08-18 第二小组 张鑫 学习笔记
    实训四十天1.学习重点1.MySQL常用函数2.数据库设计3.JDBC2.学习心得今天的内容主要是JDBC,四天没有用idea,属实有点生疏了,要多多练习才行3.学习内容MySQL常用函数......
  • Linux与DNS的学习笔记
    最近由于对公司里同事搭建的智能DNS很感兴趣,我开始学习它的搭建方法,首先我带大家重新复习一下关于DNS的基础知识。 大家可能总会在公众号上看到DNS相关的文章,比如《为什......
  • #10007. 「一本通 1.1 练习 3」线段
    #include<bits/stdc++.h>usingnamespacestd;structnode{ intl,r;};boolcmp(nodex,nodey){ returnx.r<y.r;}classSolution{ public: intsolve(vector......
  • 【数论】组合数学学习笔记
    蒟蒻的组合数学实在是太弱了,所以在初赛之前赶紧来复习一下,大部分内容由\(OI-Wiki\)整合而来。普及知识点标\(J\),提高知识点标\(S\)加法原理&乘法原理(\(J\))加法原理......
  • 二分法代码笔记
    二分法代码笔记最近复习二分法的题目,发现左右区间的二分写法总是无法第一时间写出正确的,故痛定思痛,通过写笔记的形式记录下来。这里需要说明的是,二分法多用于单调情况下......
  • 2022-08-18 第四组 王佳齐 学习笔记
    思维导图MySQL常用函数聚合函数count:计数。count(*)≈count(1)>count(主键)count(*):MySQL对count(*)底层优化,count(0)。count(1)count(主键)count(字段)min:最......
  • 2022-08-18 第二组刘禹彤 学习笔记
    打卡35天  ###学习内容MySQL常用函数聚合函数count:计数------------count(*)≈count(1)>count(主键)>count(字段)count(*):MySQL对count(*)底层优化----count(min:最小值......
  • 「学习笔记」Kruskal 重构树
    前置芝士:最小生成树、Kruskal算法、瓶颈(图上路径最值)正文定义在执行Kruskal算法的过程中我们会从小到大加入若干条边,现在我们仍然按照这个顺序。首先新建\(n\)个......
  • 关于Windows11笔记本打开TXT文件提示“包无法进行更新、相关性和冲突验证”的解决方法
    如标题,错误提示如下图:解决方法:PS:遇到这个问题时在网上搜索了很多帖子,基本都是说把txt文件的默认应用程序设置成记事本,其实系统的默认应用程序本来就是使用记事本打开,所......
  • Linux 运维项目发布指令笔记
    安装xsheel7 如果安装以后显示“该版本是一个beta测试版本”修改本地时间到一个比较早的时间以后再安装可以破除此问题指令:1.ps-ef|grepjava    查看进程......