File tree Expand file tree Collapse file tree 1 file changed +48
-0
lines changed
Expand file tree Collapse file tree 1 file changed +48
-0
lines changed Original file line number Diff line number Diff line change 1+ ``` cpp
2+ #include < bits/stdc++.h>
3+ using namespace std ;
4+ using ll = long long ;
5+
6+ int N;
7+ vector<vector<int >> v;
8+ vector<ll> a, d, s, u;
9+
10+ void dfs1 (int n, int p) {
11+ s[ n] = 1;
12+ for(int i: v [ n] ) if(i != p) {
13+ dfs1(i,n);
14+ s[ n] += s[ i] ;
15+ d[ n] += d[ i] + (a[ n] ^a[ i] ) * s[ i] ;
16+ }
17+ }
18+
19+ void dfs2(int n, int p) {
20+ if(n != 1) u[ n] = u[ p] + d[ p] - d[ n] + (a[ n] ^a[ p] ) * (N - 2 * s[ n] );
21+ for(int i: v [ n] ) if(i != p) dfs2(i,n);
22+ }
23+
24+ int main() {
25+ cin.tie(0)->sync_with_stdio(0);
26+
27+ int T;
28+ for(cin>>T;T--;) {
29+ cin>>N;
30+ a = vector<ll >(N+1);
31+ d = vector<ll >(N+1);
32+ s = vector<ll >(N+1);
33+ u = vector<ll >(N+1);
34+ v = vector<vector<int >>(N+1);
35+ for(int i=1;i<=N;i++) cin>>a[ i] ;
36+ for(int i=1,p,q;i<N;i++) {
37+ cin>>p>>q;
38+ v[ p] .push_back(q);
39+ v[ q] .push_back(p);
40+ }
41+ dfs1(1,0);
42+ dfs2(1,0);
43+ for(int i=1;i<=N;i++) cout<<d[ i] +u[ i] <<' ';
44+ cout<<'\n';
45+ }
46+
47+ }
48+ ```
You can’t perform that action at this time.
0 commit comments