愛爭吵的猴子
★★☆ 輸入檔案: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 左右是股份制企業生產的。分紅 寓言中的幾個合夥人要是能早知道這點道理就好了。經濟學家 克雷洛夫作為乙個文學家當然不會去關心產權之類的問題,但他對社會現象描述的背後已經無意間證明了產權的重要性。他的寓言 分紅 就是...