題意:有n只猴子,每只猴子都有乙個能力值.最初每只猴子都只認識自己.然後
給出m組詢問,每次都有兩隻猴子,如果他們相互認識輸出-1,否則他們會請出他們認
識的猴子中
能力值最大的猴子,這兩隻猴子自身的能力值除以2,然後兩隊猴子都
相互認識了.每次輸出這堆相互認識的猴子中能力值最高的.
顯然需要乙個並查集維護下認識的猴子,然後需要另一種資料結構能夠實現:
某一堆中的最大值查詢;合併兩個堆.
顯然就是左偏樹了.每次找到兩個並集根,先把兩個根的能力值除以二存下來,
然後兩個左偏樹刪掉堆頂,然後把新的能力值插進去再合併就行了.最後更新下
並查集和輸出新堆頂.
#include #include #include #include #include #include using namespace std;
#define maxn 111111
int n, m;
int a[maxn];
int fa[maxn];
int find (int x)
struct node
};node *tree[maxn];
void init (node *&t, int key)
int dis (node *a)
node *merge (node *a, node *b)
node *pop (node *a)
node *insert (node *root, int num)
int top (node *a)
int main ()
scanf ("%d", &m);
while (m--)
else
}for (int i = 1; i <= n; i++) if (tree[i])
}return 0;
}
HDU 1512 左偏樹 並查集
思路 左偏樹裡面摻了一些並查集的應用 這裡放乙份左偏樹的 模板 重點就是merge函式了 int merge int k1,int k2 插入 合併原樹和新節點。刪除最小值 合併左右子樹。刪在某個地方的值 打個標記 以後用的時候再忽略 在這道題中 刪的時候 找到左右子樹 並查集變成它自己 再合併 b...
HDU1512 左偏樹 斜堆
本來我是在開開心心 淚流滿面 地刷scapegoat tree的,結果突然間就看見了乙個奇奇怪怪的東西 斜堆。因為昨天剛好學了左偏樹,於是就來回憶了一發,然後發現。既然有斜堆了為毛還要左偏樹啊!嗯好吧均攤確實不靠譜 此處 splay 但你告訴我為毛斜堆跑得比左偏樹快啊!好吧常數我吃了。其實斜堆和左偏...
HDU3938 並查集 並查集
先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...