题解:P11887 「Stoi2025」爱在西元前
liangliang517 · · 题解
题意
给定一个无根树
思路
首先先考虑一种
设当前枚举到了修改第
那么可以发现,当把
这时可以分讨
那么对于前两种情况,就只需要求出
这样就得到了
代码
#include<bits/stdc++.h>
using namespace std;
long long t,n,l,r,ma,a[1000010],f[1000010][2],g[1000010];
vector<long long> v[1000010];
void dfs(long long m,long long fa){
f[m][0]=0,f[m][1]=a[m],g[m]=1;
for(int i=0;i<v[m].size( );i++){
if(v[m][i]==fa) continue;
dfs(v[m][i],m);
f[m][1]+=f[v[m][i]][0];
f[m][0]+=max(f[v[m][i]][0],f[v[m][i]][1]);
if(f[v[m][i]][1]>f[v[m][i]][0]){
g[m]+=g[v[m][i]];
}
}
return;
}
void dfs2(long long m,long long fa,long long ff0,long long ff1,long long gg){
f[m][0]+=max(ff0,ff1);
f[m][1]+=ff0;
if(ff0<ff1) g[m]+=gg;
if(f[m][0]!=f[m][1]) ma=max(ma,g[m]);
for(int i=0;i<v[m].size( );i++){
if(v[m][i]==fa) continue;
dfs2(v[m][i],m,f[m][0]-max(f[v[m][i]][0],f[v[m][i]][1]),f[m][1]-f[v[m][i]][0],g[m]-(f[v[m][i]][1]>f[v[m][i]][0])*g[v[m][i]]);
}
return;
}
int main( ){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
cin>>l>>r;
v[l].push_back(r);
v[r].push_back(l);
}
ma=0;
dfs(1,0);
dfs2(1,0,0,0,0);
cout<<ma<<"\n";
for(int i=1;i<=n;i++){
v[i].clear( );
}
}
return 0;
}