比赛 20160415x 评测结果 AAAAAAATTT
题目名称 游戏内测 最终得分 70
用户昵称 debug 运行时间 4.559 s
代码语言 C++ 内存使用 33.78 MiB
提交时间 2016-04-15 15:35:24
显示代码纯文本
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int v[555555]={};int ans[555555]={};//ans[i]表示假定第i个点为0分钟到达,自身包括子树安装完所有游戏的最少时间
int weizhi[555555]={},shuliang[555555]={},e[1555555]={};
int gen[555555]={},siz[555555]={};struct ff{int x,y;}f[555555]={};
int tou,wei,q[555555]={};int rudu[555555]={};int n,m;
struct gg{int x,y,z;}h[555555]={};int tot;
bool cmpp(gg m,gg n){return m.z>n.z;}
int main()
{
	freopen("gamebeta.in","r",stdin);
	freopen("gamebeta.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&v[i]);
	for(int i=1;i<n;i++)
		scanf("%d%d",&f[i].x,&f[i].y),shuliang[f[i].x]++,shuliang[f[i].y]++;
	for(int i=1;i<=n+1;i++)weizhi[i]=weizhi[i-1]+shuliang[i-1];
	for(int i=1;i<n;i++)
		e[weizhi[f[i].x]]=f[i].y,e[weizhi[f[i].y]]=f[i].x,weizhi[f[i].x]++,weizhi[f[i].y]++;
	for(int i=n+1;i>0;i--)
		weizhi[i]=weizhi[i-1];
	tou=0,wei=0;
	q[0]=1;
	while(tou<=wei)
	{
		int te=q[tou];
		for(int i=weizhi[te];i<weizhi[te+1];i++)
			if(e[i]!=gen[te])
				gen[e[i]]=te,q[++wei]=e[i];
		tou++;
	}
	for(int i=1;i<=n;i++)rudu[i]=shuliang[i]-1;rudu[1]++;
	tou=0,wei=-1;
	for(int i=1;i<=n;i++)
		if(rudu[i]==0)
			q[++wei]=i;
	while(tou<=wei)
	{
		int te=q[tou];
		rudu[gen[te]]--;
		if(rudu[gen[te]]==0)
			q[++wei]=gen[te];
		siz[te]=1;
		for(int i=weizhi[te];i<weizhi[te+1];i++)
			if(e[i]!=gen[te])
				siz[te]+=siz[e[i]];
		tou++;
	}
	for(int i=1;i<=n;i++)rudu[i]=shuliang[i]-1;rudu[1]++;
	tou=0,wei=-1;
	for(int i=1;i<=n;i++)
		if(rudu[i]==0)
			q[++wei]=i;
	while(tou<=wei)
	{
		int te=q[tou];
		rudu[gen[te]]--;
		if(rudu[gen[te]]==0)
			q[++wei]=gen[te];
		if(siz[te]==1)
		{ans[te]=v[te];tou++;continue;}
		tot=-1;
		for(int i=weizhi[te];i<weizhi[te+1];i++)
			if(e[i]!=gen[te])
				h[++tot].x=ans[e[i]]+1,h[tot].y=siz[e[i]]*2,h[tot].z=h[tot].x-h[tot].y;
		sort(h,h+tot+1,cmpp);
		int maxx=0,cnt=0;
		for(int i=0;i<=tot;i++)
		{
			if(cnt+h[i].x>maxx)
				maxx=cnt+h[i].x;
			cnt+=h[i].y;
		}
		ans[te]=max(maxx,v[te]);
		tou++;
	}
	ans[1]=max(ans[1],n*2-2+v[1]);
	printf("%d\n",ans[1]);
	return 0;
}