G:多吃蘑菇
?
?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int maxn=1e5+5;
ll w[maxn],c[maxn],ans[maxn];
int n;
vector<int>G[maxn];
ll W[maxn];
void dfs(int x,int fa)
{
ans[x]=ans[fa];
int tmp=W[c[x]];
if(w[x]>W[c[x]]) ans[x]+=w[x]-W[c[x]],W[c[x]]=w[x];
for(auto v:G[x]) if(v!=fa) dfs(v,x);
W[c[x]]=tmp;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>w[i];
for(int i=1; i<=n; i++)
cin>>c[i];
for(int i=1; i<=n-1; i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
for(int i=1; i<=n; i++)
cout<<ans[i]<<endl;
return 0;
}
|