李超线段树

杭电AcmKeHaoWanLe模板1 3.10 线段树合并 . 3.11 树链剖分 3.12 李超线段树 . 3.14 左偏树 . 3.15 带修改区间第 k 小 . 3.16 Segment Be 立即下载

题目描述

秋月十分擅长对空作战。尽管如此,必要的训练也不能懈怠。

在一次训练中,会有m个事件发生。
1. 出现一架飞机在(x1,y1)到(x2,y2)的线段上出现并来回飞行。
2. 秋月接到指令,要在x坐标为a处击坠一架飞行路线经过该位置的飞机。
为了确保击坠的可能性最大,秋月将选择在x位置时高度最低的飞机。

由于只是训练任务,秋月并不会真正地击坠飞机。你只需要在每次接到指令时告诉她高度最低的飞机的y坐标就可以了。


题解

这道题就要用到所谓的李超线段树, 主要的思想就是计算出每个线段的最优势线段, 最优势线段就是指, 从当前线段的x轴往上看, 暴露得最多的就是最优的, 所以说高度最低的一定是在某条又是线段里面, 每次插入维护一下就行了, 靠新开两个域, 分别是当前优势线段在当前线段 l 处的高度, 和在r处的高度, 就能判断新线段和就线段谁才是最优势线段. 查询递归取max即可. x坐标的范围是1e9的, 注意动态开空间. 
上面讲的只是大概, 代码里面有详解, 很清晰, 能看懂.
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-8;
const int lg = 30;
const int maxn = 200005;
const int inf  = 1e9;
int n, id, root;
inline const int read(){
	register int x = 0;
	register char ch = getchar();
	while(ch < '0' || ch > '9') ch = getchar();
	while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
	return x;
}
struct node{
	int l, r;
	double lv, rv;
}tr[maxn * lg];
inline double calc(int x, int x1, double y1, int x2, double y2){
	return (y2 - y1) * (x - x1) / (x2 - x1) + y1;
}
inline void modify(int &rt, int lf, int rg, int x1, double y1, int x2, double y2){
	if(!rt) rt = ++id, tr[rt].lv = inf, tr[rt].rv = inf; //没有线段, 那左右端点的最优线段的高度值初始化为
	int mid = (lf + rg) >> 1;
	if(x1 <= lf && rg <= x2){//如果覆盖了当前线段区间 
		double lv = calc(lf, x1, y1, x2, y2), rv = calc(rg, x1, y1, x2, y2); //计算新线段在左右端点的高度 
		double sl = lv - tr[rt].lv, sr = rv - tr[rt].rv;
		if(sl <= eps && sr <= eps){ //说明了当前新插入的在当前线段(线段树区间)左右端点处的都要比原来的优势线段小, 
									//那么肯定暴露得最多. 
			tr[rt].lv = lv;//直接修改 
			tr[rt].rv = rv;
			return;
		}
		if(sl >= -eps && sr >= -eps) return;//比原来的都高, 没有用 
		if(fabs(sl) < fabs(sr)){//这里说明新老交叉, 可以画一下, 图上是两个交叉的线段
		 						//这里是靠一个相似三角形来判断哪个暴露的更多 
			if(sr <= eps){ //如果是负数的话说明当前线段优 
				modify(tr[rt].l, lf, mid, lf, tr[rt].lv, rg, tr[rt].rv); //先把旧的递归下去更新
																		//这样保证把每条线段都用的淋漓尽致 
				tr[rt].lv = lv; //更新当前最优线段, 如果查询的位置在这个区间里的话一定会计算这条最优线段的 
				tr[rt].rv = rv;//可以看看query辅助理解 
			} else
				modify(tr[rt].l, lf, mid, x1, y1, x2, y2); //新老交点在左边,由于不如老的优,所以用武之地只在左边 
		} else {
			if(sl <= eps){ //说明当前线段优 
				modify(tr[rt].r, mid + 1, rg, lf, tr[rt].lv, rg, tr[rt].rv); //同上 
				tr[rt].lv = lv;
				tr[rt].rv = rv;	
			} else
				modify(tr[rt].r, mid + 1, rg, x1, y1, x2, y2);
		}
	} else {///不然就递归处理 
		if(x1 <= mid) 
			modify(tr[rt].l, lf, mid, x1, y1, x2, y2);
		if(x2 > mid)
			modify(tr[rt].r, mid + 1, rg, x1, y1, x2, y2);
	}
}
double query(int rt, int lf, int rg, int pos){
	if(!rt) return inf;
	if(lf == rg) return tr[rt].lv;
	int mid = (lf + rg) >> 1;
	double ans = calc(pos, lf, tr[rt].lv, rg, tr[rt].rv);//计算高度 
	if(pos <= mid) 
		return min(ans, query(tr[rt].l, lf, mid, pos));
	else 
		return min(ans, query(tr[rt].r, mid + 1, rg, pos));
}
int main(){
	freopen("defense.in", "r", stdin);
	freopen("defense.out", "w", stdout);
	n = read();
	int x1, y1, x2, y2;
	for(register int i = 1; i <= n; ++i){
		int opt = read();
		if(opt == 1){
			x1 = read(), y1 = read(), x2 = read(), y2 = read();
			modify(root, 1, inf, x1, y1, x2, y2); //插入 
		}else
			x1 = read(), printf("%0.4lf\n", query(root, 1, inf, x1));
	}
}


游戏封包抓取实战:雷电模拟器+ProxyDroid+查尔斯3.93+WPE全流程解析 本文详细解析了使用雷电模拟器、ProxyDroid、查尔斯3.93和WPE进行游戏封包抓取的全流程实战。通过环境搭建、代理配置与工具协同,手把手教你抓取HTTP/HTTPS及原始Socket数据,涵盖从流量转向、证书安装到数据分析和常见问题排查,是学习游戏网络协议分析与安全测试的实用指南。 阅读详情

相关推荐

用简单仿真链路产生 WiFi CSI(不依赖专用工具箱,matlab实现)

这篇文章详细介绍了使用MATLAB仿真生成WiFi信道状态信息(CSI)的过程。内容包括:准备工作(定义OFDM和MIMO参数)、基本参数设置(天线数、FFT点数等)、构造训练OFDM符号、多径瑞利信道建模、逐天线时分发射接收处理、CSI信道估计方法,以及幅值和相位的可视化。通过BPSK调制和瑞利衰落信道仿真,实现了简单的CSI生成流程,为初学者理解CSI产生机理提供了直观指导。文章强调这仅是基础仿真,更深入的研究需要实际数据采集。文末还提供了WiFi指纹定位的相关参考资料。

静水流深,沧笙踏歌 1202

【数据结构】李超线段树

我们用这条线段递归更新对应子树,用另一条线段作为懒标记更新整个区间,这就保证了递归下传的复杂度。不合法的点对就是原来的路径不经过环的,因为它们想走第二条路径就会经过环一次,会有点重复走。其中肯定有一个子区间被左区间或右区间完全包含,也就是说,在两条线段中,肯定有一条线段,只可能成为左区间的答案,或者只可能成为右区间的答案。如图,加入黄色线段后,只有红色节点的标记被更新,而绿色节点的标记还未被改变。这里我的写法是给李超线段树上的每个节点打个时间标记,记录它的线段是哪个时间段的,这样不用考虑删除的问题。

conti123的博客 1606

3D视觉革命丨多相机协同拼接技术如何重塑工业检测边界

本文深入探讨了多相机协同拼接技术如何突破单台3D相机的物理局限,实现工业检测从“点面”到“立体”的无死角覆盖。通过拆解系统标定、同步融合等核心技术,并结合锂电池、长轴零件等实战案例,揭示了该技术如何以虚拟“超级视觉传感器”重塑检测边界,提升精度与效率。

weixin_29056865的博客 385

李超线段树(Li-Chao Segment Tree)

李超线段树 李超线段树是一种用于维护平面直角坐标系内线段关系的数据结构。它常被用来处理这样一种形式的问题:给定一个平面直角坐标系,支持动态插入一条线段,询问从某一个位置 (X,+∞)(X,+\infty)(X,+∞) 向下看能看到的最高的一条线段(也就是给一条竖线,问这条竖线与所有线段的最高的交点 如上图,有三条线段,两条红色竖线代表两个询问,则点 AAA 与点 BBB 就是询问到的答案。 李超线段树的核心是维护每个区间的“最优势线段”,即在每个区间的中点处最高的线段。询问时我们可以对所有包含横坐标为

weixin_45630722的博客 1107

FAST-LIO2:论文和算法解析

本文介绍了FAST-LIO2算法:一种快速、鲁棒、通用的激光雷达-惯性里程计框架。FAST-LIO2基于高效的紧密耦合迭代卡尔曼滤波器,具有两个关键的新颖之处,可实现快速,稳健和准确的激光雷达导航(和测绘)。第一种方法是直接将原始点注册到地图上然后更新地图,而不提取特征。这样可以利用环境中的细微特征,从而提高准确性。消除手工设计的特征提取模块,也使其能够适应不同扫描模式的新兴激光雷达;

超爱吃小蛋糕的66的博客 1万+

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

【树形数据结构】李超线段树 (Li-Chao Tree)

李超线段树通过在每个区间维护中点最优线段,支持高效动态插入线段与单点最值查询,结合离散化可处理大坐标范围,常用于斜率优化等场景。

zhangmohan123321的博客 1136

多标签图像分类:标签依赖关系建模的最新论文解读与实战应用

多标签图像分类:标签依赖关系建模的最新论文解读与实战应用 ,人工智能,计算机视觉,大模型,AI,本文解读了最新相关论文,包括基于图神经网络(GCN)的ML-GCN方法,通过构建标签相关矩阵建模依赖关系;区域潜在语义依赖的RLSD模型,定位关键区域并利用RNN建模语义依赖;以及语义图表示学习的SSGRL框架,结合语义解耦与交互模块。通过实战应用,展示了基于PyTorch的ML-GCN模型实现,包括图像特征提取、标签依赖建模及训练评估流程,为多标签图像分类提供了有效解决方案。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

李超线段树系列 题解

简单介绍一下李超线段树。lrkkxk通俗的讲,就是维护一个坐标系内,加入给定端点的线段,查询某个点x的最大/小y值。对于修改与查询操作敬请自行学习了(其实模板不算很长,就是拿线段树改造一下,写一个比较两条线段在某点比较大小的布尔函数即可)李超线段树具有这种维护线段的功能,在做斜率优化相关题目时,简直就是万金油。在做斜率优化题目,我们常推导出某个斜率slope和某个量的大小关系。如果这个量x具有单调的性质,就可以使用单调队列维护,但是如果它不单调就不能用单调队列来做了。

m0_60506105的博客 1528

信创服务器(麒麟 V10 SP3)安装 NVIDIA GeForce RTX 5070 驱动

本文介绍了在麒麟V10 SP3系统上安装NVIDIA RTX 5070显卡驱动的详细步骤。首先需要关闭nouveau驱动,安装必要的编译环境和工具,确保内核版本与kernel-devel完全一致。最后运行NVIDIA驱动安装程序,关键选择包括启用DKMS支持、编译模块、禁用32位兼容和nouveau驱动。整个流程适用于海光CPU和Blackwell架构GPU的国产操作系统环境。

猿小白的博客 668

ESP32-CAM 赋能 AI 视觉巡检小车:自主避障与目标追踪实现全解析

本文基于 ESP32-CAM 实现了低成本 AI 视觉巡检小车的核心功能,硬件成本<100 元,兼顾自主避障与目标追踪。算法升级:移植 YOLOv5nano 量化模型(INT8),提升目标检测精度(如识别巡检场景中的 “异常物体”“人员”);无线拓展:通过 MQTT 协议将巡检图像、距离数据上传到阿里云 / 腾讯云,实现远程监控;多传感器融合:增加温湿度(DHT11)、红外测温(MLX90614)模块,扩展巡检维度;路径规划:结合 SLAM 算法,实现自主建图与路径巡检。

weixin_42300449的博客 367

李超线段树 & 树链剖分 学习笔记

李超线段树 & 树链剖分 学习笔记(摘自2025年日祭)

一枚初中生的博客 1104

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1027

李超线段树 总结

李超线段树可以支持如下操作: 在区间\(l~r\)加入线段\(y=kx+b\)。 询问直线\(y=x\)与所有线段交点的\(y\)坐标最值。 例题:模板题 做法: 对于线段树的每个区间,维护“最优线段”,即上面露出最多的线段。 在插入一条线段时,同样对应到区间上。 考虑如何在线段树的区间上加入一条线段: 如果该区间没有线段或在此区间内,两条线段没有交点,则直接修改,不是最优的线段扔掉...

weixin_42465242的博客 196

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

李超线段树 例题BZOJ1568、3938

大佬的博客讲的很清晰 李超线段树就是标记永久化维护区间线段最值的数据结构 假设有下列的问题: 给定平面中nnn条线段,(给出斜率kkk和截距bbb,并且知道线段左右端点的横坐标值为多少),然后mmm个询问,每次给定x=x0x = x_0x=x0​,问和x=x0x = x_0x=x0​相交的直线中,横坐标值最大为多少。 很明显nnn和mmm数据范围大了之后,我们无法暴力,此时看到区间端点,可以想能否用数据结构维护这个东西,即----李超线段树,查询和更新借助线段树都变成了lognlognlogn了,变的可接受

forward77 548

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

李超线段树学习笔记

至今不会李超线段树\(.jpg\)…… 前言 先说明一下,李超线段树只能解决“只插入”的问题,如果有删除恕它无能为力 过程 先考虑这么一个问题,我们要资瓷动态插入直线以及询问直线\(x=k\)与其它所有直线相交的点中最大的\(y\)坐标是多少 李超线段树的具体过程是这样的 对于一个区间,我们维护该区间的所有直线中,从上往下去看可以看到它的长度最大的一条直线(即没有被其他直线覆盖的长度最大) (li...

weixin_34112181的博客 196

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 论可持久化Trie树贪心在区间最大最小值的运用
下一篇: [BZOJ]4832 抵制克苏恩 期望dp
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值