比赛 20160415x 评测结果 TTTTTTTTTT
题目名称 游戏内测 最终得分 0
用户昵称 collor 运行时间 10.012 s
代码语言 C++ 内存使用 28.09 MiB
提交时间 2016-04-15 16:26:50
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn=500500,maxm=500500;
struct edge
{
	int y,next;
}e[maxm<<1];
struct node
{
	int x; int tim;
}s[maxn<<1];
int n,m,len=0;
int linkk[maxn],dv[maxn],dep[maxn],ti[maxn];
bool f[maxn],ff[maxn];
int a[maxn],stack[maxn<<1],top=0,tup=0;
int read()
{
	int x=0; char ch=getchar();
	while (ch<'0'||ch>'9')ch=getchar();
	while (ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x;
}
inline bool mycmp(node xx,node yy)
{
	return (xx.tim>yy.tim);
}
inline void insert(int xx,int yy)
{
	e[++len].next=linkk[xx]; e[len].y=yy;
	linkk[xx]=len;
}
void init()
{
	memset(f,true,sizeof(f));
	memset(ff,0,sizeof(ff));
	n=read();
	for (int i=1;i<=n;i++) a[i]=read();
	int xx,yy;
	for (int i=1;i<n;i++){
		xx=read(); yy=read();
		insert(xx,yy);
		insert(yy,xx);
		dv[xx]++; if (dv[xx]>1)f[xx]=0;
		dv[yy]++; if (dv[yy]>1)f[yy]=0;
	}
	dv[1]++;
}
void dfs(int t,int depth)
{
	ff[t]=1;
	int sta=top+1,tot=0,ha=tup;
	for (int i=linkk[t]; i ;i=e[i].next){
		int u=e[i].y;
		if (!ff[u]){
			s[++tup].x=u;
			if (dv[u]>1){
				stack[++top]=u;
				tot++;
			}
			else s[tup].tim=ti[u];
		}
	}
	for (int i=sta;i<=tot;i++) dfs(stack[i],depth+1);
	if (!tot){
		sort(s+ha+1,s+ha+dv[t],mycmp);
		int maxx=0; int now=0;
		for (int i=ha;i<ha+dv[t];i++){
			now++;
			if (maxx<now+s[i].tim)maxx=s[i].tim+now;
			now++;
		}
		ti[t]+=maxx+1; ti[t]+=depth+1;
	}
}
int main()
{
	freopen("gamebeta.out","r",stdin);
	freopen("gamebeta.out","w",stdout);
	init();
	dfs(1,0);
	printf("%d\n",ti[1]);
	return 0;
}