李超线段树

坏了,讲了 \(N\) 天后我才开始学。

首先你有若干条线段。

QQ20250720-175749

根据初二学的知识,我们可以知道:

一条直线可以表示为一次函数。

\(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?\)

直接普通线段树查询即可。

posted @ 2025-07-28 20:31  Distant_Cloud  阅读(13)  评论(1)    收藏  举报