Skip to content

Commit c4e6b0c

Browse files
authored
Merge pull request #1338 from AlgorithmWithGod/khj20006
[20251107] BOJ / P4 / 트리와 XOR / 권혁준
2 parents 06cd691 + d8ac572 commit c4e6b0c

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
```

0 commit comments

Comments
 (0)