跟题解对了二百组拍,没对出错,交上去只有40分,WA
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int subtree[600000];
int c[600000];
int q[600000],r[600000];
vector<int> G[600000];
bool cmp (int i,int j) {
int r=max((2*subtree[j]+q[i]+1),(q[j]+1));
int l=max((2*subtree[i]+q[j]+1),(q[i]+1));
return l<r;
}
int sub_tree (int u) {
subtree[u]=1;
for (int i=0;i<G[u].size();i++) subtree[u]+=sub_tree(G[u][i]);
//cout<<u<<' '<<subtree[u]<<endl;
return subtree[u];
}
int dfs (int u) {
for (int i=0;i<G[u].size();i++) {
q[G[u][i]]=dfs(G[u][i]);
}
sort(G[u].begin(),G[u].end(),cmp);
int ans=0,tot=0;
for (int i=0;i<G[u].size();i++) {
ans=max(ans,q[G[u][i]]+tot*2+1);
//cout<<G[u][i]<<' '<<q[G[u][i]]<<' '<<tot<<endl;
tot+=subtree[G[u][i]];
//tot*=2;
}
ans=max(ans,c[u]);
//cout<<u<<' '<<ans<<endl;
return ans;
}
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++) cin>>c[i];
for (int i=1;i<n;i++) {
int f,t;
cin>>f>>t;
f--,t--;
if (f>t) swap(f,t);
G[f].push_back(t);
}
//cout<<endl;
sub_tree(0);
cout<<max(dfs(0),n*2-2+c[0]);
return 0;
}