2022 CCPC Guilin Site G
Luckyblock写了就是我写了(
2022 CCPC Guilin Site G - Luckyblock - 博客园 (cnblogs.com)
const int MAXN=2e5+5;
int n;
int a[MAXN];
typedef pair<int,int> P;
vector<int> e[MAXN];
vector<P> d[MAXN];
void dfs1(int u=1,int f=0){
for(auto v:e[u]){
if(v==f) continue;
dfs1(v,u);
d[u].push_back(P((d[v].empty()?0:d[v][0].first)+a[v],v));
}
sort(d[u].begin(),d[u].end(),greater<P>());
}
void dfs2(int u=1,int f=0,int last=0){
if(f)
d[u].push_back(P(last,f));
while(d[u].size()<4) d[u].push_back(P(0,0));
sort(d[u].begin(),d[u].end(),greater<P>());
for(auto v:e[u])
if(v!=f)
dfs2(v,u,d[u][0].second==v?d[u][1].first+a[u]:d[u][0].first+a[u]);
}
unordered_map<int,int> dp[MAXN];
inline int F(int i,int j){
if(dp[i].count(j)) return dp[i][j];
int p1=0;while(d[i][p1].second==j) ++p1;
int p2=p1+1;while(d[i][p2].second==j) ++p2;
int res=d[i][p1].first+d[i][p2].first+a[i];
for(auto v:e[i])
if(v!=j) res=max(res,F(v,i));
return dp[i][j]=res;
}
int main(){
R(n);
for(int i=1;i<=n;i++) R(a[i]);
for(int i=1;i<n;i++){
int u,v;
R(u);R(v);
e[u].push_back(v);
e[v].push_back(u);
}
dfs1();
dfs2();
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,d[i][0].first+d[i][1].first+d[i][2].first+d[i][3].first);
for(int i=1;i<=n;i++)
for(auto j:e[i])
ans=max(ans,F(i,j)+F(j,i));
printf("%d\n",ans);
return 0;
}