既然新學了左偏樹,那我就來寫一些學了左偏樹之後的總結吧
首先,它支援的是兩個堆的合併過程。那麼最容易想到的是把乙個堆的元素全部彈出,乙個乙個加入另乙個堆中,就合併了。顯然這樣合併的複雜度是o(n)的,再加上程式的其他部分,很慢。我們就考慮讓複雜度減小到o(logn),很恐怖,沒錯,這就是左偏樹存在的意義。
那為什麼要叫左偏樹,顧名思義,往左偏的樹,我們首先命名乙個dis,ls,rs,表示乙個節點到他下方最近的空節點的距離,左孩子,右孩子。顯然,為了維護左偏那麼dis[ls[i]]一定要維護大於dis[ys[i]],如果小於了,就換。並且為了保證這個點的dis是離空節點最近的,顯然是維護dis[i]=dis[rs[i]]+1。至於為什麼一定要左偏,是因為我們之後的操作是往右合併,所以操作次數會減少。(具體看後文把)
我們來模擬一下,如果兩個堆a,b要合併,那麼新的堆頂元素一定是兩個堆堆頂元素的最大值。這是必然的,那麼我們在比較完之後,把兩個堆頂的最大值放在a堆的堆頂,再把小的那乙個放在b堆的堆頂,此時a堆的堆頂已經對後面的合併沒有影響了,就可以繼續合併更小的值了,我們考慮把b堆往a堆的右孩子決定( 需要注意:我們在整個左偏樹合併過程中,都直接以堆頂的編號作為堆的序號,所以到了右孩子,就相當於到了以右孩子為堆頂的乙個堆),這樣不就是乙個遞迴嘛,不停地比較,然後合併新堆和右孩子。
int merge(rg int a,rg int b)//合併a堆和b堆
很容易想到,刪除堆頂元素,不就是把堆頂元素的左孩子和右孩子合併嘛
int delete(rg int a)//刪除a堆的堆頂元素
t1 洛谷p1552 [apio2012]派遣
我寫的題解emmm:[洛谷p1552] [apio2012]派遣
t2洛谷p3377 【模板】左偏樹(可並堆)
t3 洛谷p1456 monkey king
//這兩道實在不行可以去看看洛谷的題解
t4 洛谷p3261 [jloi2015]城池攻占
我寫的題解emmm:[洛谷p3261] [jloi2015]城池攻占
最後我再推薦一位大佬的部落格,我就是和他學的左偏樹:租酥雨的左偏樹
左偏樹總結
問 左偏樹是啥?答 就是往左偏的樹。評 廢話。追答 其實是具有堆性質的,同時也具有左偏性質的樹啦。追評 講的很厲害的樣子,但還是廢話啊。左偏樹的堆性質不需要解釋,就是說這是一棵二叉樹,而且父親節點的鍵值要比左右兒子 如果有的話 都大 為方便表述,以下堆均指的是大根堆 至於左偏性質,自然就是為了實現快...
左偏樹 模板
神經病也可以寫成右偏樹 具體左偏指左節點的距離 geq 右節點的距離 距離指離最近擁有空節點的節點的距離 乙個節點的值一定 或 leq 或 geq 或 其子節點的值 由於左偏性質,每次可以合併至右邊,維護左偏性質後就可以保證複雜度 被踩爆的板子 或者是我?include define ls lson...
猴王 左偏樹
題目描述 很久很久以前,在乙個廣闊的森林裡,住著n只好鬥的猴子。起初,它們各幹各的,互相之間也不了解。但是這並不能避免猴子們之間的爭吵,當然,這只存在於兩個陌生猴子之間。當兩隻猴子爭論時,它們都會請自己最強壯的朋友來代表自己進行決鬥。顯然,決鬥之後,這兩隻猴子以及它們的朋友就互相了解了,這些猴子之間...