猴王 左偏樹

2021-09-29 14:38:18 字數 1034 閱讀 9288

題目描述

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

假設每乙隻猴子都有乙個強壯值,每次決鬥後都會減少一半(比如10會變成5,5會變成2.5)。並且我們假設每只猴子都很了解自己。就是說,當它屬於所有朋友中最強壯的乙個時,它自己會站出來,走向決鬥場。

輸入輸入分為兩部分。

第一部分,第一行有乙個整數n(n<=100000),代表猴子總數。

接下來的n行,每行乙個數表示每只猴子的強壯值(小於等於32768)。

第二部分,第一行有乙個整數m(m<=100000),表示有m次衝突會發生。

接下來的m行,每行包含兩個數x和y,代表第x個猴子和第y個猴子之間發生衝突。

輸出輸出每次決鬥後在它們所有朋友中的最大強壯值。資料保證所有猴子決鬥前彼此不認識。

樣例輸入520

1610104

42 3

3 43 5

1 5樣例輸出85

510

#include

#include

#include

using

namespace std;

const

int maxn =

100005

;int lc[maxn]

, rc[maxn]

, fa[maxn]

, dist[maxn]

, v[maxn]

;int

merge

(int x,

int y)

intfindroot

(int x)

//del返回新的根節點

intdel

(int x)

intmain()

return0;

}

左偏樹總結

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

左偏樹 模板

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

左偏樹概述

參考 直接看ioi ioiio i國家集訓隊 就行了,講的很好。補充結構體定義 struct tree tree maxn 其中val valva l代表該節點的值,dis disdi s代表距離,son 0 son 0 son 0 代表左兒子編號,son 1 son 1 son 1 代表右兒子編號...