Advertisement
Guest User

Untitled

a guest
Nov 17th, 2018
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. /****Author: Barish Namazov****/
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. /***TEMPLATE***/
  7. #define all(v) (v).begin(),(v).end()
  8. #define rall(v) (v).rbegin(),(v).rend()
  9.  
  10. #define F first
  11. #define S second
  12. #define pb push_back
  13.  
  14. #define endl '\n'
  15.  
  16. const int max4 = 10004;
  17. const int maxx = 100005;
  18. const int max6 = 1000006;
  19. const int lg5 = 17;
  20.  
  21. const int INF = 2 * 1000000007;
  22. const long long INFLL = 4LL * 1000000000 * 1000000000;
  23.  
  24. /***************/
  25.  
  26. int powmod (int a, int b, int mod) {
  27.     int res = 1; a %= mod;
  28.     for (; b; b >>= 1) {
  29.         if (b & 1) {
  30.             res = 1LL * res * a % mod;
  31.         }
  32.         a = 1LL * a * a % mod;
  33.     }
  34.     return res;
  35. }
  36.  
  37. int gcd (int a, int b) {
  38.     while (b > 0) {
  39.         int t = a % b;
  40.         a = b, b = t;
  41.     }
  42.     return a;
  43. }
  44.  
  45. int lcm (int a, int b) {
  46.     return (a / gcd (a, b)) * b;
  47. }
  48.  
  49. int is_prime (int n) {
  50.     if (n <= 1 || n > 3 && (n % 2 == 0 || n % 3 == 0))
  51.         return 0;
  52.     for (int i = 5, t = 2; i * i <= n; i += t, t = 6 - t)
  53.         if (n % i == 0)
  54.             return 0;
  55.     return 1;
  56. }
  57.  
  58. /******Don't forget to use long long when needed!!******/
  59.  
  60. int arr[maxx];
  61. vector <int> g[maxx];
  62.  
  63. int pref[maxx];
  64. void prec(int v, int par = 0) {
  65.     pref[v] = pref[par] ^ arr[v];
  66.     for (int i : g[v]) {
  67.         if (i != par) {
  68.             prec(i, v);
  69.         }
  70.     }
  71. }
  72.  
  73. int P;
  74. long long res = 0;
  75. int dp[maxx][2];
  76. void prec_dp(int v, int par = 0) {
  77.     dp[v][0] = (pref[v] & P) == 0;
  78.     dp[v][1] = !dp[v][0];
  79.     for (int i : g[v]) {
  80.         if (i != par) {
  81.             prec_dp(i, v);
  82.             dp[v][0] += dp[i][0];
  83.             dp[v][1] += dp[i][1];
  84.         }
  85.     }
  86. }
  87. void dfs(int v, int par = 0) {
  88.     int pr = (arr[v] & P) > 0;
  89.     if (pr == 0) {
  90.         int total0 = 0;
  91.         for (int i : g[v]) {
  92.             if (i != par) {
  93.                 total0 += dp[i][0];
  94.             }
  95.         }
  96.         for (int i : g[v]) {
  97.             if (i != par) {
  98.                 res += 1LL * dp[i][1] * (total0 - dp[i][0]);      
  99.             }
  100.         }
  101.     } else {
  102.         int total0 = 0, total1 = 0;
  103.         for (int i : g[v]) {
  104.             if (i != par) {
  105.                 total0 += dp[i][0];
  106.                 total1 += dp[i][1];
  107.             }
  108.         }
  109.         long long rest = 0;
  110.         for (int i : g[v]) {
  111.             if (i != par) {
  112.                 rest += 1LL * dp[i][1] * (total1 - dp[i][1]);
  113.                 rest += 1LL * dp[i][0] * (total0 - dp[i][0]);
  114.             }
  115.         }
  116.         res += rest / 2;/*
  117.         for (int i : g[v]) {
  118.             if (i != par) {
  119.                 res += dp[i][1];
  120.             }
  121.         }*/
  122.     }
  123.     if (pref[par] & P) {
  124.         for (int i : g[v]) {
  125.             if (i != par) {
  126.                 res += dp[i][0];
  127.             }
  128.         }
  129.     } else {
  130.         for (int i : g[v]) {
  131.             if (i != par) {
  132.                 res += dp[i][1];
  133.             }
  134.         }
  135.     }
  136.     for (int i : g[v]) {
  137.         if (i != par) {
  138.             dfs(i, v);
  139.         }
  140.     }
  141. }
  142. int main() {
  143.     //freopen("in.txt","r",stdin);
  144.     //freopen("out.txt","w",stdout);
  145.     ios_base :: sync_with_stdio(0);
  146.     cin.tie(0), cout.tie(0);
  147.     int n;
  148.     cin >> n;
  149.     for (int i = 1; i <= n; i++) {
  150.         cin >> arr[i];
  151.     }
  152.     int a, b;
  153.     for (int i = 1; i < n; i++) {
  154.         cin >> a >> b;
  155.         g[a].pb(b), g[b].pb(a);
  156.     }
  157.     prec(1);
  158.     long long total = 0;
  159.     for (P = 1; P <= 10000000; P <<= 1) {
  160.         prec_dp(1);
  161.         res = 0;
  162.         dfs(1);
  163.         total += 1LL * res * P;
  164.         //cout << P << " " << res << endl;
  165.     }
  166.     for (int i = 1; i <= n; i++) {
  167.         total += arr[i];
  168.     }
  169.     cout << total << endl;
  170.     return 0;
  171. }
  172. /*
  173. 5
  174. 2 3 4 2 1
  175. 1 2
  176. 1 3
  177. 3 4
  178. 3 5
  179. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement