fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. // parity problem using bit manipulation
  4.  
  5. void dfs(int node, vector<vector<int>> adj, int used[], int parent[], vector<int> &dp, vector<int> &d, int val[]) {
  6. used[node] = 1;
  7. for (auto v: adj[node]) {
  8. if (!used[v]) {
  9. parent[v] = node;
  10. d[v] = d[node] + 1;
  11. dfs(v, adj, used, parent, dp, d, val);
  12. }
  13. }
  14.  
  15. dp[node] = val[node] ^ d[node];
  16. int sum = 0;
  17.  
  18. for (auto v: adj[node]) {
  19. if (v != parent[node]) {
  20. sum += dp[v];
  21. }
  22. }
  23.  
  24. dp[node] += sum;
  25. }
  26.  
  27. int main() {
  28. int n;
  29. cin >> n;
  30.  
  31. vector<vector<int>> adj(n+1);
  32. int val[n+1];
  33.  
  34. for (int i = 1; i <= n; i++) {
  35. cin >> val[i];
  36. }
  37.  
  38. for (int i = 0; i < n-1; i++) {
  39. int u, v;
  40. cin >> u >> v;
  41.  
  42. adj[u].push_back(v);
  43. adj[v].push_back(u);
  44. }
  45.  
  46. int used[n+1] = {0};
  47. int parent[n+1]= {0};
  48. vector<int> dp(n+1, 0);
  49. vector<int> d(n+1, 0);
  50. d[1] = 0;
  51.  
  52. dfs(1, adj, used, parent, dp, d, val);
  53.  
  54. for (int i = 1; i <= n; i++) {
  55. cout << d[i] << " " << dp[i] << "\n";
  56. }
  57.  
  58. //cout << dp[n] << "\n";
  59. return 0;
  60. }
Success #stdin #stdout 0s 5320KB
stdin
4
1 2 3 4
1 2
1 3
3 4
stdout
0 12
1 3
1 8
2 6