cogs愛爭吵的猴子 題解

2021-07-01 18:43:24 字數 1638 閱讀 3592

愛爭吵的猴子

★★☆ 輸入檔案:monkeyk.in 輸出檔案:monkeyk.out 簡單對比

時間限制:1 s 記憶體限制:128 mb

【問題描述】

在乙個森林裡,住著n只好鬥的猴子.開始,他們各自為政,互不相干.但是猴子們不能消除爭吵,但這僅僅發生在兩隻互不認識的猴子之間.當爭吵發生時,爭吵的兩隻猴子都會求助他們各自最強壯的朋友,並且決鬥.當然,決鬥之後,兩隻猴子及他們所有的朋友都相互認識了,並且成為朋友,爭吵將不會在他們之間發生.

假定每乙隻猴子有乙個強壯值,在每次決鬥之後變為原來的一半(例如,10將為變為5,5將會變為2).

假定每乙隻猴子認識他自己. 也就是當他發生爭吵,並且自己是他的朋友中最強壯的,他將代表自己進行決鬥.

【輸入格式】

有幾組測試資料,每組測試資料由兩部分構成.

第一部分:第一行有乙個整數 n(n<=100,000),表示猴子的數量.下面有n行.每行有乙個數,表示猴子的強壯值(<=32768).

第二部分:第一行有乙個整數m(m<=100,000),表示有m次爭吵發生.下面有m行,每行有兩個整數x和y,表示在第x只猴子和第y只猴子之間發生爭吵.

【輸出格式】

對於每一次爭吵,如果兩隻猴子認識,輸出-1,否則輸出乙個數,表示決鬥後朋友中最強壯猴子的強壯值.

【輸入輸出樣例】

monkeyk.in

5 20

16 10

10 4

5 2 3

3 4

3 5

4 5

1 5

monkeyk.out

8 5

5 -1

10

分析:並查集,加個優先佇列維護最大強壯值,但資料規模大,要用啟發式合併,按樹的高度將小樹合併到大樹上。

#include

#include

#include

#include

using namespace std;

priority_queue strongest[100001];

int f[100001],a[100001],n,m;

int rank[100001];

int find(int

x)void un(int

x,int

y) int strongp=strongest[p].top();

strongest[p].pop();

int strongq=strongest[q].top();

strongest[q].pop();

f[p]=q;

while (!strongest[p].empty())

strongest[q].push(strongp/2);

strongest[q].push(strongq/2);

printf("%d\n",strongest[q].top());

rank[q]=rank[p]+rank[q];

}}int main()

scanf("%d",&m);

intx,y;

for (int i=1;i<=m;++i)

return

0;}

11 02 猴猴的比賽

猴猴今天要和小夥伴猩猩比賽爬樹,為了公平不碰撞,猴猴和猩猩需要在不同的樹上攀爬。於是它們選了兩顆節點數同為n的樹,並將兩棵樹的節點分別以1 n標號 根節點標號為1 但兩棵樹的節點連線方式不盡相同。現在它們決定選擇兩個標號的點進行比賽。為了方便統計,規定它們比賽中必須都向上爬。即選定的賽段節點u 節點...

51nod 猴猴的比賽

h yp erli nk hyperlink hyperl ink d es crip tion description descri ptio n 給定兩棵樹,求在兩棵樹同時滿足u uu是v vv的父親的對數 資料範圍 n 1 05 n leq 10 5 n 105sol utio nsoluti...

寓言中的經濟學 分紅爭吵的根源

只有股份制既可無限做大,產權又明晰,因此成為主要形式。在美國這樣的國家,gdp中有90 左右是股份制企業生產的。分紅 寓言中的幾個合夥人要是能早知道這點道理就好了。經濟學家 克雷洛夫作為乙個文學家當然不會去關心產權之類的問題,但他對社會現象描述的背後已經無意間證明了產權的重要性。他的寓言 分紅 就是...