比赛 |
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;
}