關於吉利線段樹

引言

這玩意兒又稱\(Segment\ Tree\ Beats\) 。由吉老師、\(Picks\)、美國隊長三位知名毒瘤發明。
個人精神受到了污染......ubuntu

線段樹簡介

線段樹什麼的太難了,不是很會啊.....
線段樹最強的地方在於,若是標記支持合併,那麼咱們就可以快速進行區間修改了。數據結構

一類特殊標記

維護這樣一個標記\((a,b)\) ,表示\(x\to max(x + a , b)\)
顯然標記可合併:\((a,b) + (c,d) = (a + c , max(b + c , d))\)
這個標記能夠同時處理區間加法、區間覆蓋,對應爲\((add,-inf)\)\((-inf , cov)\)
這個標記還能取\(max\)\(max((a,b) , (c,d)) = (max(a,c) , max(b , d))\)
因爲該分段函數取上平面交後段數不變,因此支持維護歷史最大值,能夠說是至關好用了。
然而這個東西在解決歷史最小值,區間取\(min\)等一系列問題上無能爲力,因此咱們須要另闢蹊徑。模塊化

一類歷史最大、最小值問題

設當前最大值爲\(mx\)、最小值爲\(mn\)、修改增量標記爲\(t\)
設歷史最大值爲\(hmx\),歷史最小值爲\(hmn\)
直接維護很差維護,咱們考慮維護歷史最大標記\(mxt\)、歷史最小標記\(mnt\)
能夠理解爲,這個歷史最大標記\(mxt\)是修改標記\(t\)的一個最大前綴和,歷史最小標記\(mnt\)相似。
那麼下放就很簡單了。
先用新的前綴和更新全部歷史最優值:
\(mx + mxt' \to hmx\)\(mn + mnt'\to hmn\)\(t + mxt' \to mxt\)\(t + mnt'\to mnt\)
而後再把當前值改成真實值:\(t'\to t\)\(t' + mx \to mx\)\(t' + mn\to mn\)
固然這些標記不必定要是加法標記。
只要是支持合併,而且可以定義大小關係的標記,咱們均可以這麼作。
例題:
[UOJ164]【清華集訓2015】V ; 代碼函數

一類趨近問題

當修改操做逐漸使得元素趨近於相同時,每每就能夠搞事情。
目前已知的這類操做:spa

  • 區間開根 + 加法 + 求和
  • 區間或 + 與 + 求和
  • 區間除法 + 加法 + 求和

解決方案就是:若該修改對當前區間影響相同則打標記,不然暴力遞歸處理。
好比,對於開根、除法操做,記錄區間最小、最大值。
對於區間或 + 區間與操做,記錄區間內每一位是否相同(用位運算便可全部位一塊兒實現)。
例題:
[BZOJ5312]冒險 ; 代碼
[UOJ228] 基礎數據結構練習題 ; 代碼遞歸

一類區間最值問題

勢能分析之類的略過,反正我口胡的勢能分析連我本身都不知道對不對。
以區間取\(max\)爲例。
維護區間最小值\(mn\)、區間次小值\(se\)
對於區間對\(x\)\(max\)操做,首先定位到\(log\)個線段樹結點,而後從它們開始\(dfs\)
設當前點爲\(u\)
\(x \leq mn_u\) ,顯然該操做對區間無影響,\(return\)
\(mn_u < x < se_u\),咱們維護最小值修改標記\(t\),把最小值改成\(x\)便可。
\(se_u \leq x\) ,暴力遞歸。
顯然加法操做能夠直接維護,額外維護一個標記\(d\)表示最小值以外的其餘數的修改量。
注意一點:\(pushdown\)時,若\(se_u = inf\) , 那麼\(se_u\) 不能被修改,由於咱們要保證勢能分析時關鍵點的數量。
同時\(pushdown\)的時候,咱們要討論兒子的每一個值對應哪一個標記,進行對應修改。
區間取\(min\)是同樣的,維護區間最大值\(mx\),區間次大值\(se\)便可。
須要注意的一點:
當咱們須要同時支持區間\(max\)、區間\(min\)的時候,取\(max\)時要考慮它對最大值的影響,取\(min\)時要考慮它對最小值的影響。
咱們的加法標記要分爲三類:\(mn.t\)\(mx.t\)\(md.t\),分別對應區間最大值增量、區間最小值增量,非最大最小值增量。
同樣的\(pushdown\)時要考慮兒子每個值對應的修改應該是哪個,而後用其屬於的修改標記進行修改。
例題
[BZOJ4695] 最假女選手 ; 代碼
[BZOJ4355] Play-with-sequence ; 代碼get

當全部問題混到一塊兒?

線段樹各類操做大融合。
沒什麼好說的,按照上面的方法一個一個實現便可。
代碼必須模塊化,而且是條理清晰的模塊化,不然這種題是調不出來的。
例題
[UOJ169] 元旦老人與數列 ; 代碼
[UOJ170] Picks loves segment tree VIII ; 代碼it

相關文章
相關標籤/搜索