hdu 5788 level up 對dfs序建立主席樹,兩個dfs序對應線段樹之間的差值就是對應線段的差值,用主席樹處理一棵子樹的中位數,這種樹問題裡計算子節點的改變對父節點的影響的題目,很多時候會在dfs中用樹狀陣列維護相關資訊。
hdu 5790 prefix 詢問乙個區間有幾個不同的樹,對每個(l, r)詢問,在r對應的線段樹里求[l, r]的區間和就好,對字首的判斷自己一開始還想用hash值,其實直接在字典樹里記錄對應字首之前出現的位置就好。
codechef xrqrs 多個操作,可持久化字典樹和線段樹的組合體,正常寫就好了,利用線段樹之間的差值來確定區間的線段樹。
hihocoder 1232 給兩顆樹,每次詢問兩個樹上兩條到根路徑中相同編號的點中深度最大的那個。將乙個樹樹鏈剖分,另乙個樹以樹鏈剖分的重編號為下標,實際點的編號為最值建立線段樹,可持久化,那麼找到一條路徑對應的線段樹,另一條路徑在裡面查出最值就好了。事實證明資料範圍不超過10的題都是最適合瞎搞的,n2的lca瞎搞各種複雜度比主席樹低。
bzoj 4571 n個數,問[l, r]區間裡每個數加上x後與b異或的最大值,可持久化,然後針對每個數加上b,就是平移整個線段樹,另外線段樹可以看作是一棵滿字典樹,像在字典樹上查詢就好了
hihocoder 1046 長度為n的序列有n2
個子序列,每個子串行的價值是序列內所有數字之和(重複數字只計算一次),問第k大的子串行價值,區間更新主席樹,需要注意的是lazy不能下傳,而是在pushup的時候用lazy更新上傳上來的答案,然後利用優先佇列經典地求第k大,每次拿出乙個數,就把對應線段樹的對應位置置為-inf
bzoj 4026 水題,問乙個區間不同顏色個數的題都是在r對應的線段樹里查詢[l, r]區間
bzoj 2653 給n個數字,問左端點在[a, b],右端點在[c, d]的序列中每個序列的中位數的最大值。總共n個數,最多只有n個中位數,離散化這些中位數,利用可持久化分別建立線段樹,對每個中位數對應的線段樹,比它小的數所在位置標-1,其它標1,二分就可以找到乙個區間對應的中位數,然後再記錄乙個區間左右端點能拓展出的最大值,就可以確定出最大的中位數。除了建樹是可持久化,其它都是線段樹操作。
bzoj 3218 神題,可持久化線段樹優化網路流
可持久化Treap
本來是想寫一點題的,但是hfu最近讓我改鍵盤指法,原來都是亂打 手速蠻快就是錯的多 剛開始練手法真的煩躁,像我這種從來不用小指頭的 就寫個學習筆記吧.非教程向,只是懂了後寫點隨筆,練成指法說不定能來填坑.可持久化treap首先是基於非旋轉式treap的,如果要旋轉的話那麼就會破壞父子關係導致無法可持...
可持久化Treap
可持久化treap本質上市乙個二叉平衡樹,若不對其規則進行修改,中序遍歷後得出的序列是遞增的。void maintain o 計算結點o的size int lowcount key 比key所在位置小1 int uppercount key key所在的位置,如果有多個相同的key,選位置最大的 i...
可持久化專題
一切之始主席樹 可持久化並查集 首先可持久化並查集我們是用主席樹來維護的,葉子節點維護每個位置的fa 維護2個量 每個點的父親和每棵樹的根節點的高度。那麼不使用路徑壓縮的話這個版本的主席樹和上個版本的主席樹 有且只有乙個點會被改動。那麼就可以進行可持久化了。既然取消了路徑壓縮,為了保證複雜度,我們需...