李超线段树
1.ROIR 20242.UER #73.2024-10-8 #334.BTS 245.2024-10-7 #326.2024-10-6 #317.2024-10-4 #308.2024-9-5 Div39.2024-10-1 #2810.2024-10-2 #2911.DMOJ12.UER #113.CCPC Harbin14.TAP15.NAC16.2024-9-1217.2024-9-1318.CCO 2019 Day219.2024-9-2720.EGOI21.湘潭夏令营22.2024-9-2023.2024-9-24 #2624.2024-9-2525.异或线性基
26.李超线段树
27.JOI 2023 / 202428.OOI XVIII29.2024-10-9 #3430.2024-10-10 #3531.2024-10-14 #3732.2024-10-15 #3833.2024-10-11 #3634.2024-10-17 #4035.2024-10-21 逐月破星杯36.2024-10-16 NordicOI 202337.2024-10-22 逐月黯月杯38.2024-10-14 Div139.逐月新星杯李超线段树
李超线段树是线段树的一个变种,主要支持在平面直角坐标系中动态地插入线段或直线,并查询某一条平行于
假设只插入直线并且维护最大值:
在李超线段树中,对于每一个结点,我们需要维护的是在这个结点所对应的区间
假设我们现在有两条直线
那么,我们就比较这两条直线在
图中绿色直线是直线
因此,区间
那么
这时,我们考虑比较这两条直线的斜率,我们会发现
但是需要注意的是当两条直线斜率相同时,就可以直接退出了。
有时候为了防止一些小数的情况,李超线段树通常我会写成左闭右开的形式。
并且由于坐标的范围问题,通常我会写动态开点。
ll F(Node x, int pos) {
return 1ll * x.k * pos + x.b;
}
void add(Node x) {
int i = 1, l = -INF, r = INF + 1;
while (l + 1 <= r) {
if (tr[i].b == inf) {
tr[i] = x; break;
}
int mid = l + (r - l) / 2;
if (F(tr[i], mid) > F(x, mid)) swap(tr[i], x);
if (l + 1 == r || tr[i].k == x.k) break;
if (tr[i].k > x.k) {
if (!son[i][1]) son[i][1] = ++c, tr[c] = {0, inf};
i = son[i][1], l = mid;
} else {
if (!son[i][0]) son[i][0] = ++c, tr[c] = {0, inf};
i = son[i][0], r = mid;
}
}
}
ll query(int x) {
int i = 1, l = -INF, r = INF + 1;
ll tp = inf;
while (l + 1 <= r && i) {
int mid = l + (r - l) / 2;
tp = min(tp, F(tr[i], x));
if (l + 1 == r) break;
if (x < mid) i = son[i][0], r = mid;
else i = son[i][1], l = mid;
}
return tp;
}
而如果是插入线段的话,事实上就是先找到线段所覆盖的区间,然后和直线一样更新线段树上的直线即可。
这里最需要注意的就是左闭右开区间的边界判断问题。
void modify(int i, int l, int r, int ql, int qr, Node x) {
if (qr <= l || ql >= r) return ;
if (ql <= l && r <= qr) {
add(x, i, l, r);
return ;
}
if (l + 1 == r) return ;
int mid = l + (r - l) / 2;
if (!son[i][0]) son[i][0] = ++c, tr[c] = {0, inf};
modify(son[i][0], l, mid, ql, qr, x);
if (!son[i][1]) son[i][1] = ++c, tr[c] = {0, inf};
modify(son[i][1], mid, r, ql, qr, x);
}
作者:cn
出处:https://www.cnblogs.com/chengning0909/p/18401219
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】