其實很早就有這些這個的慾望了。。。
但是由於種種原因(包括班主任),一直咕到現在。。。
咕咕咕。。。
不能再咕下去了!
於是熬夜來寫這個。
先看乙個例題: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 座標是多少 李超線段樹的具體過程是這樣的 對於乙個區間,我們維護該區間的所有直線中,從上往下去看可以...