李超线段树
坏了,讲了 \(N\) 天后我才开始学。
首先你有若干条线段。

根据初二学的知识,我们可以知道:
一条直线可以表示为一次函数。
即 \(y=kx+b\) 的形式
所以,当我们读入线段时:
x=(x+lst-1)%Mod+1,y=(y+lst-1)%mod+1;
X=(X+lst-1)%Mod+1,Y=(Y+lst-1)%mod+1;
if(x>X){
swap(x,X),swap(y,Y);
}
if(x==X){
a[++cnt].k=0,a[cnt].b=max(y,Y);
}
else{
a[++cnt].k=1.0*(Y-y)/(X-x),a[cnt].b=1.0*y-a[cnt].k*x;
}
处理出线段的 \(k\) 与 \(b\)。
然后,才真正到了李超线段树的 \(part\)
我们要先知道李超线段树是干啥的。
对于一颗普通线段树,我们每段区间维护的是这一段区间的信息。
而对于李超线段树,我们每段区间维护的是这段区间中最优的线段。
Part 1
\(how \quad can \quad we \quad insert?\)
对于一段区间,如果新插入的线段没有全覆盖这段区间,那我们需要继续递归。
那如果全覆盖了呢?
我们就需要判断下这条线段与原来最优线段的关系。
分讨一下:
1.线段树很特点的一个特点不就是取区间 \(mid\) 吗,那我们先比较下 \(mid\) 位置上两个线段谁更优,更新一下。
2.在区间左端点 \(l\) ,如果在 \(mid\) 上的劣的线段比现在更新后的线段更优,那么我们可以递归左区间。
3.在区间右端点 \(r\) ,如果在 \(mid\) 上的劣的线段比现在更新后的线段更优,那么我们可以递归右区间。
Code:
if(ck(xx,z[x].id,mid)) swap(xx,z[x].id);
if(ck(xx,z[x].id,l)) chang(z[x].l,l,mid,L,R,xx);
if(ck(xx,z[x].id,r)) chang(z[x].r,mid+1,r,L,R,xx);
Part 2
\(how \quad can \quad we \quad find?\)
直接普通线段树查询即可。

浙公网安备 33010602011771号