李超樹 學習筆記

2021-08-06 02:02:19 字數 1230 閱讀 4103

最近做多校聯賽的時候,遇到了一道不會做的題,題解上寫需要用到李超樹,所以就去學習了一下。

參考部落格:

李超樹的經典題目是bzoj的1568。

在乙個平面裡面,有兩種操作:

1.每次在乙個平面插入乙個條直線(給出兩個端點(x0,y0)和(x1,y1))

2.詢問與x=k的相交的直線中,最上面的直線是哪一條。

對於這道題,以x軸開一棵線段樹,每乙個點記的是這個點所代表的區間裡,與中點mid相交的線段中最高的是哪一條。

插入一條線段的時候,比較中點,即x取mid兩個線段的值,如果斜率高的線段mid的大,那麼[mid+1,r]這個線段一定是斜率高的直線更高,遞迴更新[l,mid]這個線段的,如果斜率高的線段mid的小,那麼[l,mid]的值一定是斜率小的線段好,遞迴更新[mid+1,r]這個線段。注意要遞迴之前更新當前節點的值。

找答案的時候要從表示x=k的節點以及它祖先的所有線段都要找一下哪一條最高

#include

#include

#include

#include

#include

#define n 500003

using

namespace

std;

int n,m,tr[n*4];

double a[n*2],b[n*2];

int pd(int x,int y,int pos)

void change(int now,int l,int r,int x)

int mid=(l+r)/2;

if (b[x]>b[tr[now]])

if (pd(x,tr[now],mid))

change(now<<1,l,mid,tr[now]),tr[now]=x;

else change(now<<1|1,mid+1,r,x);

if (b[x]if (pd(x,tr[now],mid))

change(now<<1|1,mid+1,r,tr[now]),tr[now]=x;

else change(now<<1,l,mid,x);

} double getans(int k,int x)

double qjmax(int now,int l,int r,int x)

int main()

else

} }

李超樹學習筆記

其實很早就有這些這個的慾望了。但是由於種種原因 包括班主任 一直咕到現在。咕咕咕。不能再咕下去了!於是熬夜來寫這個。先看乙個例題 bzoj1568 jsoi2008 blue mary開公司 其實這個算是裸題了。當然我做的第一道李超樹的題不是這個。題目要求區間內的所有直線的最高點的最大值。並且帶插入...

李超樹學習筆記

這東西有點噁心啊,搞了好久才懂一點。1.有什麼用?對於乙個區間 l,r 每個點可以取的權值符合表示式 y kx b 的線段 有k條線段覆蓋在所有點上,可以動態插入線段,求每個時刻某個點或某個區間的最大 最小值。它的思想是 盡可能不將優勢線段下傳,2.什麼叫優勢線段?假如是使每個點的值最大 就是使區間...

李超線段樹學習筆記

至今不會李超線段樹 jpg 先說明一下,李超線段樹只能解決 只插入 的問題,如果有刪除恕它無能為力 先考慮這麼乙個問題,我們要資瓷動態插入直線以及詢問直線 x k 與其它所有直線相交的點中最大的 y 座標是多少 李超線段樹的具體過程是這樣的 對於乙個區間,我們維護該區間的所有直線中,從上往下去看可以...