可持久化數據結構


影魔

想到了離線的$n^2$做法,然后就不會了。

這里記錄兩個做法(%%%GPskyh和%%%素質先鋒Lrefrain的)

抓住最值,一個點能作為最值的區間的范圍可以找出來。

最主要的就是統計答案

1.先說skyh的 考慮到第一種情況非常好統計,我們試圖在其中找出第二種情況的答案

我們先維護一個單調遞減棧,發現第一種情況點對數是$O(n)$級別的,即只有一個點出棧和入棧的時候才會形成點對。

利用這個性質先把所有點對找出來,然后就可以直接掃了。

延續這個思路,我們發現,能形成情況二的點的是棧中的相鄰元素,也就是說,新加進去的點對應着一段區間。

然后就是維護一棵線段樹 從前往后掃,掃到一個點就把這個點對應的區間造成的貢獻加進去,然后統計以這個點為右端點的區間答案。

線段樹維護的是左端點的貢獻,也就是我們在保證右端點合法的基礎上利用線段樹就可以進行降維打擊。

我沒有實現,只是口胡。

2.再說Lrefrain 假如我們有一個點對應的左右比它大的第一個數$l_i$,$r_i$,那么答案來自

1.[$l_i$,$r_i$]->p1

2.[$l_i$,$i+1$~$r_i-1$]->p2

3.[$l_i+1$~$i-1$,$r_i$]->p2

那我們怎么統計呢?

網上的做法是把區間化為點對,然后把情況2,3化為線段,每次詢問視作一個矩陣。

但是現在我們可以有一個更簡單的方法,維護一棵線段樹,這顆線段樹的含義是某一個端點在$i$的貢獻,注意沒有限定左還是右。

那我們一個詢問的答案是某一端點在$l~r$的另一端點也在$l~r$的貢獻。

這時候只需要在$l$-1處減去前面所有對$l~r$的貢獻在$r$處加上就行了。美妙的差分!

常用套路:區間到點對的轉化,固定一維,另一維用數據結構維護,差分思想的運用。

樹上詢問

關於維護一棵支持區間修改的主席樹,我們不能下傳標記,即標記永久化,但標記永久化需要注意一點就是更新的時候要加上自己懶標記的貢獻,當我們統計一個區間的時候,只能利用這個來統計子樹內部標記的貢獻,也算是標記永久化的一個注意的地方,調了一下午。

注意思考問題一定要全面,標記永久化后不僅標記無法下傳,而且標記對上面節點的貢獻也無法統計!!!!所以維護sum的時候一定要加上標記貢獻。

可持久化Trie板子:

1.自己YY的記錄來自的位置,只能求區間異或一個數的最大值。

2.還有一種是記錄每個節點的size,然后就可以利用這個來搞很多東西。

世博會:

用到了結論:切比雪夫距離和曼哈頓距離的轉化:

$max(|x_1-x_2|,|y_1-y_2|)$ ->把兩個點轉化為$((x+y)/2,(x-y)/2)$,然后求兩點曼哈頓距離。

用主席樹來查找區間中位數就行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM