Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /****Author: Barish Namazov****/
- #include <bits/stdc++.h>
- using namespace std;
- /***TEMPLATE***/
- #define all(v) (v).begin(),(v).end()
- #define rall(v) (v).rbegin(),(v).rend()
- #define F first
- #define S second
- #define pb push_back
- #define endl '\n'
- const int max4 = 10004;
- const int maxx = 100005;
- const int max6 = 1000006;
- const int lg5 = 17;
- const int INF = 2 * 1000000007;
- const long long INFLL = 4LL * 1000000000 * 1000000000;
- /***************/
- int powmod (int a, int b, int mod) {
- int res = 1; a %= mod;
- for (; b; b >>= 1) {
- if (b & 1) {
- res = 1LL * res * a % mod;
- }
- a = 1LL * a * a % mod;
- }
- return res;
- }
- int gcd (int a, int b) {
- while (b > 0) {
- int t = a % b;
- a = b, b = t;
- }
- return a;
- }
- int lcm (int a, int b) {
- return (a / gcd (a, b)) * b;
- }
- int is_prime (int n) {
- if (n <= 1 || n > 3 && (n % 2 == 0 || n % 3 == 0))
- return 0;
- for (int i = 5, t = 2; i * i <= n; i += t, t = 6 - t)
- if (n % i == 0)
- return 0;
- return 1;
- }
- /******Don't forget to use long long when needed!!******/
- int arr[maxx];
- vector <int> g[maxx];
- int pref[maxx];
- void prec(int v, int par = 0) {
- pref[v] = pref[par] ^ arr[v];
- for (int i : g[v]) {
- if (i != par) {
- prec(i, v);
- }
- }
- }
- int P;
- long long res = 0;
- int dp[maxx][2];
- void prec_dp(int v, int par = 0) {
- dp[v][0] = (pref[v] & P) == 0;
- dp[v][1] = !dp[v][0];
- for (int i : g[v]) {
- if (i != par) {
- prec_dp(i, v);
- dp[v][0] += dp[i][0];
- dp[v][1] += dp[i][1];
- }
- }
- }
- void dfs(int v, int par = 0) {
- int pr = (arr[v] & P) > 0;
- if (pr == 0) {
- int total0 = 0;
- for (int i : g[v]) {
- if (i != par) {
- total0 += dp[i][0];
- }
- }
- for (int i : g[v]) {
- if (i != par) {
- res += 1LL * dp[i][1] * (total0 - dp[i][0]);
- }
- }
- } else {
- int total0 = 0, total1 = 0;
- for (int i : g[v]) {
- if (i != par) {
- total0 += dp[i][0];
- total1 += dp[i][1];
- }
- }
- long long rest = 0;
- for (int i : g[v]) {
- if (i != par) {
- rest += 1LL * dp[i][1] * (total1 - dp[i][1]);
- rest += 1LL * dp[i][0] * (total0 - dp[i][0]);
- }
- }
- res += rest / 2;/*
- for (int i : g[v]) {
- if (i != par) {
- res += dp[i][1];
- }
- }*/
- }
- if (pref[par] & P) {
- for (int i : g[v]) {
- if (i != par) {
- res += dp[i][0];
- }
- }
- } else {
- for (int i : g[v]) {
- if (i != par) {
- res += dp[i][1];
- }
- }
- }
- for (int i : g[v]) {
- if (i != par) {
- dfs(i, v);
- }
- }
- }
- int main() {
- //freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- ios_base :: sync_with_stdio(0);
- cin.tie(0), cout.tie(0);
- int n;
- cin >> n;
- for (int i = 1; i <= n; i++) {
- cin >> arr[i];
- }
- int a, b;
- for (int i = 1; i < n; i++) {
- cin >> a >> b;
- g[a].pb(b), g[b].pb(a);
- }
- prec(1);
- long long total = 0;
- for (P = 1; P <= 10000000; P <<= 1) {
- prec_dp(1);
- res = 0;
- dfs(1);
- total += 1LL * res * P;
- //cout << P << " " << res << endl;
- }
- for (int i = 1; i <= n; i++) {
- total += arr[i];
- }
- cout << total << endl;
- return 0;
- }
- /*
- 5
- 2 3 4 2 1
- 1 2
- 1 3
- 3 4
- 3 5
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement