李超樹學習筆記

2022-03-29 15:42:56 字數 2423 閱讀 5094

其實很早就有這些這個的慾望了。。。

但是由於種種原因(包括班主任),一直咕到現在。。。

咕咕咕。。。

不能再咕下去了!

於是熬夜來寫這個。

先看乙個例題:bzoj1568: [jsoi2008]blue mary開公司

其實這個算是裸題了。。。

當然我做的第一道李超樹的題不是這個。。。

題目要求區間內的所有直線的最高點的最大值。

並且帶插入。

裸的暴力$o(nm)$對吧。

然後呢?

第一想法是——分治!

將乙個區間$[l,r]$分成$[l,mid],[mid+1,r]$兩個區間,遞迴求解。

合併答案就取最大值就好。

這樣,我們便得出來乙個$o(mn\log_2n)$的演算法。。。

你會說:「這個演算法複雜度還沒暴力跑得快,我要他幹嘛???」

誠然,暴力跑得比它快得多。。。

但是你覺得這個演算法如果沒有用的話,我會講它嗎?

我們回頭看我們分治的過程:將區間一分為二,且區間大小相等。

沒錯!這個資料結構就是——線段樹

是不是很厲害!

為什麼?因為我們找到了一種資料結構來維護這玩意了!

所以線段樹每個點存區間最大值就好。

$but$!這麼做還有乙個問題:插入線段怎麼辦?

你會想:用最大值覆蓋不就好了?

那麼問題又來了:線段是有斜率的。

也就是說,在不同的點,線段的函式值是不同的。

你怎麼知道當前的點的函式值是多少呢?

可能你又會想:那我就暴力帶值進線段,把函式值算出來不就好了?

那麼恭喜,你離深淵越來越近了。

你會發現你的每一次維護都會涉及到最多$4n$個節點。

那和暴力有什麼區別???

所以這個方案被我們捨棄了。

那怎麼辦呢?

對於這個問題,國家隊隊爺李超提出一種解決辦法:

我們把線段樹中存的值從區間最大值改為區間中值最大的直線

每個節點至少會存一條直線。

但是多條直線呢?

我們可以打乙個標記,說明再這個區間內至少有乙個兩條直線的轉折點。

然後遞迴插入直線。

具體做法是這樣的:

假設原來在$[l,r]$這個區間內只有一條直線$f_1(x)=k_1x+b_1$。

現在要在區間內插入一條新直線$f_2(x)=k_2x+b_2$。

然後便是分類討論:

1. 如果$f_1(l)\geq f_2(l),f_1(r)\geq f_2(r)$:

說明$f_2(x)$在這個區間內被$f_1(x)$吊打,那麼不做任何操作;

2. 如果$f_1(l)\leq f_2(l),f_1(r)\leq f_2(r)$:

說明$f_1(x)$在這個區間內被$f_2(x)$吊打,那麼直接替換即可;

3. 如果$f_1(l)\geq f_2(l),f_1(r)\leq f_2(r)\textf_1(l)\leq f_2(l),f_1(r)\geq f_2(r)$:

說明兩直線在這個區間內有交點。

這時,我們取區間中點$mid$,判斷兩直線在$[l,mid]$之間是否相交:

若是,則右區間$[mid+1,r]$賦為在上方的曲線,左區間遞迴求解;

否則,左區間$[l,mid]$賦為在上方的曲線,右區間遞迴求解。

這樣,我們的一次插入直線操作完成。

而遞迴修改最多會涉及到$\log_2n$個節點。

所以一次修改的複雜度上限為$o(\log_2^2n)$。

然後,這題還需要用到標記永久化。

即我們不下傳標記,在求區間最大值的時候,每次訪問到乙個被詢問區間包含的區間,把答案和這個區間所維護的線段的最大值取$max$。

然後這個題就做完了。

不得不說非常的機智啊!

所以這種線段樹被稱為——李超樹

複雜度$o(m\log_2^2n)$。

瘋狂維護半平面交。。。

**的話。。。可以去題解裡找:

類似的板子題:

我做的第一道李超樹題:(萬事開頭難。。。)

其實李超樹不建議在考場上寫。

因為這玩意的修改很容易寫炸。。。

並且查錯及其噁心。。。

對於大多數$ds$能力不是極其強悍的$oier$來說,價效比並不是很高。

因為一般這種題的部分分都比正解的價效比高。。。

所以不是隊爺不寫正解。。。

而對於我這個菜雞$afo$選手來說,可以浪一浪。。。

出題人,我勸你善良。。。

李超樹 學習筆記

最近做多校聯賽的時候,遇到了一道不會做的題,題解上寫需要用到李超樹,所以就去學習了一下。參考部落格 李超樹的經典題目是bzoj的1568。在乙個平面裡面,有兩種操作 1.每次在乙個平面插入乙個條直線 給出兩個端點 x0,y0 和 x1,y1 2.詢問與x k的相交的直線中,最上面的直線是哪一條。對於...

李超樹學習筆記

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

李超線段樹學習筆記

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