李超线段树

李超线段树

概念

李超线段树是巨佬李超发明的一种可以求函数定点最值的线段树,又名李超树。代码简短,思想简明,用途广泛。

问题

李超线段树是用来解决类似于这种问题 题目传送门

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

  1. 在平面上加入一条线段。记第 i i i 条被插入的线段的标号为 i i i
  2. 给定一个数 k k k,询问与直线 x = k x = k x=k 相交的线段中,交点纵坐标最大的线段的编号。

思路

李超线段树的结构和普通线段树一样的,只是它每个节点存的是该区间优势最大的线段

区间 [ L , R ] [L,R] [L,R] 中,蓝色折线为最高折线,绿色线段为该区间的优势最大线段

插入操作

对于一个区间,它被线段覆盖的情况可以分为六种:

1、线段覆盖的区间和该区间不相交,直接返回

2、线段覆盖部分该区间,递归到左右子区间继续处理;

3、线段完全覆盖该区间: 线段在两个端点处值均比之前保存的优势线段更大,则替换优势线段,返回;

4、线段在两个端点处的值均比之前的保存的优势线段小,则返回 5、线段在两个端点处与之前保存的优势线段比较,如果在中点处更优,则更新优势线段(交换两 线段);

6、然后再判断左右端点处的值,如果该侧优势线段不占优势,则递归该侧。

查询

它维护的是区间中点处的最大(最小)值的线段,采用 标记永久化。 所谓标记永久化是指标记不下传,查询时,需要由该节点及其所有祖先的标记综合起来才能得出答案。

因为李超树每个区间保存的只是当前区间的中点的最大值,所以它的标记是不能下传的,下传了反而不 准确。

每个区间保存的只是区间 处占优势的线段的编号。(另有一个线段的数组,记录了每条线段的 斜率和截距)。优势线段仅仅只是中点更优,并不是处处占优,也不是端点占优。

适合 单点查询,查询时必须要将叶节点的所有祖先的优势线段在该处进行比较。

例题

[P4097 【模板】李超线段树 / HEOI2013] Segment - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

版题。 可以感性理解一下

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define lp p<<1
#define rp p<<1|1
using namespace std;
const int N = 1e5 + 5 , mod = 39989 , my = 1000000000;
const double eps = 1e-8;
int l[N << 3] , r[N << 3] , tr[N << 3] , tot;
double k[N] , b[N];
inline int dcmp(double x) {return fabs(x) <= eps ? 0 : x < 0 ? -1 : 1;// fabs (x) <= eps 
}
double f (int x , int p) { return 1.0 * k[x] * p + b[x]; }
bool pd (int x , int y , int p) {double fx = f(x , p) , fy = f (y , p);// return fabs (fy - fx) >= eps ? fx < fy : x > y; // return dcmp(fx-fy) ? fx < fy : x > y;return fx <= fy;
}
void build (int p , int ll , int rr) {l[p] = ll , r[p] = rr;if (ll == rr) return;int mid = (ll + rr) >> 1;build (lp , ll , mid);build (rp , mid + 1 , rr);
}
void change (int p , int ll , int rr , int x) {if (r[p] < ll || rr < l[p]) return;if (ll <= l[p] && r[p] <= rr) {if (pd (x , tr[p] , l[p]) && pd (x , tr[p] , r[p])) return;if (pd (tr[p] , x , l[p]) && pd (tr[p] , x , r[p])) {tr[p] = x;return;}int mid = (l[p] + r[p]) >> 1;if (pd (tr[p] , x , mid)) swap (tr[p] , x);if (pd (tr[p] , x , l[p])) change (lp , l[p] , r[p] , x);else change (rp , l[p] , r[p] , x);return;}change (lp , ll , rr , x) , change (rp , ll , rr , x);
}
int query (int p , int x) {if (x < l[p] || r[p] < x) return 0;if (l[p] == r[p] && l[p] == x) return tr[p];int mid = (l[p] + r[p]) >> 1 , res = 0;if (x <= mid) res = query (lp , x);else res = query (rp , x);// res = x <= mid ? query(lp,x) : query(rp,x);if (pd (res , tr[p] , x)) res = tr[p];return res;
}
int main () {int T;scanf ("%d" , &T);int op , x , lst = -1 , y , xx , yy;build (1 , 1 , 40000);while (T --) {scanf ("%d" , &op);if (!op) {scanf ("%d" , &x);x = (x + lst + mod) % mod + 1;// cout << x << "\n";lst = query (1 , x);printf ("%d\n" , lst);lst --;// if (lst) lst --;}else {scanf ("%d%d%d%d" , &x , &y , &xx , &yy);x = (x + lst + mod) % mod + 1 , xx = (xx + lst + mod) % mod + 1;y = (1ll * y + lst + my) % my + 1 , yy = (1ll * yy + lst + my) % my + 1;if (xx < x) swap (xx , x) , swap (yy , y);tot++;if (x == xx) k[tot] = 0 , b[tot] = max (y , yy);else k[tot] = (double)(yy - y) / (xx - x) , b[tot] = yy - k[tot] * xx;change (1 , x , xx , tot);  }}return 0;
}

一般的斜率优化也可以用李超线段树来写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/115444.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm常用命令系统介绍

npm常用命令系统介绍 npm helpnpm initpackage.json 文件package.json 文件属性说明默认 package.json 文件--参数[-yes|-y]设置 package.json 中字段的默认值package-lock.json 文件 npm [config|c]设置源 npm [install|i]可选参数&#xff1a;全局安装的特性 包的删除npm uni…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Dashdot服务器仪表盘

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Dashdot服务器仪表盘 一、云耀云服务器L实例介绍二、Dashdot介绍2.1 Dashdot简介2.2 开发环境要求2.3 Yarn介绍 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、检查服务器环境4.1 购买云耀云服务器L实例…

MySQL进阶 —— 超详细操作演示!!!(中)

MySQL进阶 —— 超详细操作演示&#xff01;&#xff01;&#xff01;&#xff08;中&#xff09; 三、SQL 优化3.1 插入数据3.2 主键优化3.3 order by 优化3.4 group by 优化3.5 limit 优化3.6 count 优化3.7 update 优化 四、视图/存储过程/触发器4.1 视图4.2 存储过程4.3 存…

JDBC基本概念

什么是JDBC JDBC概念 JDBC&#xff08;Java DataBase Connectivity&#xff09;是一套统一的基于Java语言的关系数据库编程接口规范。 该规范允许将SQL语句作为参数通过JDBC接口发送给远端数据库&#xff0c; …

Pytest之收集用例规则与运行指定用例

前言 上篇文章相信大家已经了解了pytest在cmd下结合各种命令行参数如何运行测试用例&#xff0c;并输出我们想要看到的信息。那么今天会讲解一下pytest是如何收集我们写好的用例&#xff1f;我们又有哪些方式来运行单个用例或者批量运行用例呢&#xff1f;下面将为大家一一解答…

2023最全CTF入门指南(建议收藏,文章末尾有福利)

前言 一、CTF简介 CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的…

uniappAndroid平台签名证书(.keystore)生成

一、安装JRE环境 https://www.oracle.com/java/technologies/downloads/#java8 记住下载默认安装地址。ps&#xff1a;我都默认安装地址C:\Program Files\Java\jdk-1.8 二、安装成功后配置环境变量 系统变量配置 AVA_HOME 放到环境变量去 %JAVA_HOME%\bin 三、生成签名证书…

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行&#xff0c;并于 9 月 15 日&#xff08;周五&#xff09;开启订购&#xff0c;9 月 22 日&#xff08;周五&#xff09;起正式发售。 据多位网友反馈&#xff0c;首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…

SQL模板-用户留存率计算

在这段实习中&#xff0c;我遇到了用户留存率计算的需求&#xff0c;这里做个总结。 首先来讲下&#xff0c;什么是用户留存&#xff1f; 在互联网行业中&#xff0c;用户在某段时间内开始使用应用&#xff0c;经过一段时间后&#xff0c;仍然继续使用该应用的用户。用户留存一…

vuex如何安装、报错、安装版本注意事项

npm i vuex报错&#xff0c;为什么呢&#xff1f; 在2022.2.7&#xff0c;Vue3就变成了默认版本&#xff0c; Vue2中&#xff0c;必须要用Vuex的3版本 Vue3中&#xff0c;必须要用Vuex的4版本&#xff0c;否则会报错 npm i vuex 安装的就是4版本 如果我们需要安装3版本&…

pcl--第十节 点云曲面重建

曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如&#xff0c;在汽车、航空等工业领域中&#xff0c;复杂外形产品的设计仍需要根据手工模型&#xff0c;采用逆向工程的手段建立产品的数字化模型&#xff0c;根据测量数据建…

Eclipse ABAP ADT 集成详细安装教程

最近看到网上有个源码使用CDS做的&#xff0c;然后看了一下原来还可以用eclipse&#xff0c;趁热打铁&#xff0c;试了一把&#xff0c;最后成功了&#xff0c;中间可能会有一些报错&#xff0c;可以自己慢慢解决&#xff0c;大概就是这样的。 SAP的开发&#xff0c;有三种开发…