題目描述
很久很久以前,在乙個廣闊的森林裡,住著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 代表右兒子編號...