写在之前
李超线段树 简称\(LCT\)
正式开始
李超线段树主要用于维护这样一类问题
有两个操作
1.插入一条直线(k,b) \(y=kx+b\)
2.给出一个值\(x\) 求\(x=k\)与这些直线交点中纵坐标的最大值
我们可以使用\(CDQ\)分治或者平衡树维护
但是这里有了一种玄学鬼畜的数据结构 李超线段树
\(TA\)的形状同正常的线段树
但是维护的是区间内的优势线段 也就是覆盖最多的线段

比如说 该区间内覆盖最多的线段就是紫色线段
考虑怎么维护
首先对于当前区间\([le,ri]\)
我们假设已经维护了一条最优线段\(old\)
现在加入一条线段\(new\)
存在四种情况

1.\(k_{new}>k_{old}\)
并且\(x=mid\)时 \(y_{old}>y_{new}\) 这个时候
优势线段依然是\(old\)左区间同样 但是右区间不一定
所以我们使用\(new\)去更新右区间 \((mid,ri]\)

2.\(k_{new}>k_{old}\)
并且\(x=mid\)时 \(y_{old} 这个时候
优势线段更新为\(new\) 右区间同样是
但是左区间不一定
所以我们再使用\(old\)去更新左区间\([le,mid]\)

3.\(k_{new}
并且\(x=mid\)时 \(y_{old} 这个时候
优势线段更新为\(new\) 左区间同样是
但是右区间不一定
所以我们再使用\(old\)去更新左区间\((mid,ri]\)

4.\(k_{new}
并且\(x=mid\)时 \(y_{old}>y_{new}\) 这个时候
优势线段依然是\(old\) 右区间同样是
但是左区间不一定
所以我们使用\(new\)去更新左区间\([le,mid]\)
这就是维护
至于查询的
我们使用到了标记永久化的思想
从上到下 不断比较 逐个取\(max\)
例题
P4254 [JSOI2008]Blue Mary开公司
这是一道板子题
#include
#include
#include
#include
#include
#include
#include
#include
#include
P4655 [CEOI2017]Building Bridges
首先这是一道\(dp\)
\[sum[i]=\sum_{i=1}^n w_i
\]
\[dp[i]=min\{dp[j]+sum[i-1]-sum[j]+(h[i]-h[j])^2\}(1≤j
最终的答案就是\(dp[n]\)
拆开之后就是
\(dp[i]=min\{dp[j]+sum[i-1]-sum[j]+h[i]^2-2* h[i]* h[j]+h[j]^2\}\)
那么就是查询\(x=h[i]\)时
线段\(y=kx+b\)
\[k=-2* h[j]
\]
\[b=h[j]^2-sum[j]+dp[j]
\]
对应的\(y\)的最小值 所以我们可以直接使用李超线段树维护
由于定义域为\([-10^6,10^6]\) 李超线段树又是类似于权值线段树
所以我们需要维护成\([0,2* 10^6]\)
然后就是基本操作了
#include
#include
#include
#include
#include
#include
#include
#include
#include
P4097 [HEOI2013]Segment
这题不一样 维护的是线段
首先对于区间\([le,ri]\)
只有当\(le=x_0\&\&x_1=ri\)时才可以产生贡献
然后对于\(x_0=x_1\)时 由于不存在斜率 需要特判
由于输出编号 所以我维护的是\(pair<>\)
#include
#include
#include
#include
#include
#include
#include
#include
#include
\(leige\) :省选考这玩意我当场吃**
HEOI 2019 RP++