左偏樹總結

2022-04-29 07:09:10 字數 1887 閱讀 1413

問:左偏樹是啥?

答:就是往左偏的樹。

評:廢話。

追答:其實是具有堆性質的,同時也具有左偏性質的樹啦。

追評:講的很厲害的樣子,但還是廢話啊。

左偏樹的堆性質不需要解釋,就是說這是一棵二叉樹,而且父親節點的鍵值要比左右兒子(如果有的話)都大(為方便表述,以下堆均指的是大根堆)。至於左偏性質,自然就是為了實現快速合併的。

我們把乙個東西記作\(dis\),空節點預設\(dis=0\),非空節點為\(dis_i=min(dis_,dis_)+1\)(就是說左右兒子裡面取較小)。要維護左偏的性質,就要保證\(dis_>=dis_\),這樣一來,就有\(dis_i=dis_+1\)。

在我們合併兩個堆的時候,我們考慮哪個堆的堆頂元素會作為新堆的堆頂元素。顯然是鍵值較大的那乙個。那麼我們就,把較大的作為堆頂,然後,把另乙個堆跟堆頂的右兒子進行合併!合併的過程是遞迴的,可以證明複雜度為\(o(logn)\)。

所以說這樣就可以實現快速合併了嗯哼。

放乙個合併(merge)的**。

int merge(int a,int b)
放乙個模板題

bzoj

luogu

在乙個忍者的幫派裡,一些忍者們被選中派遣給顧客,然後依據自己的工作獲取報償。在這個幫派裡,有一名忍者被稱之為\(master\)。除了 \(master\)以外,每名忍者都有且僅有乙個上級。為保密,同時增強忍者們的領導力,所有與他們工作相關的指令總是由上級傳送給他的直接下屬,而不允許通過其他的方式傳送。現在你要招募一批忍者,並把它們派遣給顧客。你需要為每個被派遣的忍者 支付一定的薪水,同時使得支付的薪水總額不超過你的預算。另外,為了傳送指令,你需要選擇一名忍者作為管理者,要求這個管理者可以向所有被派遣的忍者 傳送指令,在傳送指令時,任何忍者(不管是否被派遣)都可以作為訊息的傳遞 人。管理者自己可以被派遣,也可以不被派遣。當然,如果管理者沒有被排遣,就不需要支付管理者的薪水。你的目標是在預算內使顧客的滿意度最大。這裡定義顧客的滿意度為派遣的忍者總數乘以管理者的領導力水平,其中每個忍者的領導力水平也是一定的。寫乙個程式,給定每乙個忍者\(i\)的上級 \(b_i\),薪水\(c_i\),領導力\(l_i\),以及支付給忍者們的薪水總預算 \(m\),輸出在預算內滿足上述要求時顧客滿意度的最大值。

我們希望能夠算出以每乙個忍者作為管理者的時候的最優答案。顯然,在一棵子樹中,我們希望保留盡可能多的且總權值和不大於\(m\)的節點,必將會貪心地逐個丟掉最大值。所以我們用左偏樹維護大根堆,先把所有子樹的大根堆合併,再依次彈出最大值以使得總權值和不大於\(m\)。

注意到演算法的正確性:在某一棵子樹中被彈掉了,這個節點將不會再出現在更上方祖先的最優答案中。

演算法複雜度:考慮到每個節點都會被插入和刪除至多一次,所以複雜是\(o(nlogn)\)

#include#include#includeusing namespace std;

#define ll long long

const int n = 100005;

struct edgea[n];

int head[n],cnt;

int n,master,ls[n],rs[n],dis[n];

ll m,c[n],l[n],sum[n],sz[n],ans;

ll gi()

void link(int u,int v)

; head[u]=cnt;

}int merge(int a,int b)

ans=max(ans,l[u]*sz[u]);

return a;

}int main()

dfs(master);

printf("%lld",ans);

return 0;

}

part 4

再講乙個題

乙個鏈結...

左偏樹總結

既然新學了左偏樹,那我就來寫一些學了左偏樹之後的總結吧 首先,它支援的是兩個堆的合併過程。那麼最容易想到的是把乙個堆的元素全部彈出,乙個乙個加入另乙個堆中,就合併了。顯然這樣合併的複雜度是o n 的,再加上程式的其他部分,很慢。我們就考慮讓複雜度減小到o logn 很恐怖,沒錯,這就是左偏樹存在的意...

左偏樹 模板

神經病也可以寫成右偏樹 具體左偏指左節點的距離 geq 右節點的距離 距離指離最近擁有空節點的節點的距離 乙個節點的值一定 或 leq 或 geq 或 其子節點的值 由於左偏性質,每次可以合併至右邊,維護左偏性質後就可以保證複雜度 被踩爆的板子 或者是我?include define ls lson...

猴王 左偏樹

題目描述 很久很久以前,在乙個廣闊的森林裡,住著n只好鬥的猴子。起初,它們各幹各的,互相之間也不了解。但是這並不能避免猴子們之間的爭吵,當然,這只存在於兩個陌生猴子之間。當兩隻猴子爭論時,它們都會請自己最強壯的朋友來代表自己進行決鬥。顯然,決鬥之後,這兩隻猴子以及它們的朋友就互相了解了,這些猴子之間...