记录编号 158234 评测结果 AAAAAAAAAA
题目名称 [HDU 1512] 爱争吵的猴子 最终得分 100
用户昵称 Gravatar一個人的雨 是否通过 通过
代码语言 C++ 运行时间 0.409 s
提交时间 2015-04-13 17:07:56 内存使用 2.99 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int> strongest[100001];
int f[100001],a[100001],n,m;
int rank[100001];

int find(int x){return f[x]==x?x:f[x]=find(f[x]);}

void un(int x,int y)
{
	int p=find(x);
	int q=find(y);
	if (p==q) printf("%d\n",-1);
	else 
	{
		if (rank[p]>rank[q])
		{
			int t;
			t=p;
			p=q;
			q=t;
		}
		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(strongest[p].top());
			strongest[p].pop();
		}
		strongest[q].push(strongp/2);
		strongest[q].push(strongq/2);
		printf("%d\n",strongest[q].top());
		rank[q]=rank[p]+rank[q];
	}
}

int main()
{
	freopen("monkeyk.in","r",stdin);
	freopen("monkeyk.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;++i)
	 scanf("%d",&a[i]);
	for (int i=1;i<=n;++i)
	{
	 f[i]=i;
     strongest[i].push(a[i]);
     rank[i]=1;
    }
	scanf("%d",&m);
	int x,y;
	for (int i=1;i<=m;++i)
	{
		scanf("%d%d",&x,&y);
		un(x,y);
	}
	return 0;
}