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