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