| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 342088 | ruatin | Deblo (COCI18_deblo) | C++14 | 345 ms | 15464 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define forinc(i, a, b) for(int i=a; i<=b; ++i)
#define fordec(i, a, b) for(int i=a; i>=b; --i)
#define forb(i, BS) for(int i=BS._Find_first(); i<BS.size(); i = BS._Find_next(i))
#define forv(a, b) for(auto &a:b)
#define pb push_back
#define all(a) a.begin(),a.end()
#define bit(x,i) ((x>>i)&1)
#define onbit(x,i) (x|(1<<i))
#define offbit(x,i) (x&~(1<<i))
#define fastio ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
typedef long long lli;
typedef unsigned long long llu;
typedef pair<int, int> pii;
#define st first
#define nd second
const int N = 1e5 + 5, mod = 1e9+7;
int n, val[N];
vector<int> ke[N];
void readInput()
{
	cin >> n;
	forinc(i, 1, n) cin >> val[i];
	int u, v;
	forinc(i, 1, n-1)
	{
		cin >> u >> v;
		ke[u].pb(v);
		ke[v].pb(u);
	}
}
int dd[N], s[N], d[N];
void DFS(int u,int p)
{
	s[u] = 1;
	for(int v : ke[u]) if(v != p && !dd[v])
	{
        DFS(v, u);
        s[u] += s[v];
	}
}
int Find(int u,int p,int cnt)
{
    int vm = 0;
    for(int v:ke[u]) if(v!=p && !dd[v])
    {
        if(s[v] > s[vm]) vm = v;
    }
    if(s[vm] <= cnt/2) return u;
    else return Find(vm, u, cnt);
}
vector<int> tmp;
void get(int u, int p)
{
	tmp.pb(u);
	for(int v : ke[u]) if(v != p && !dd[v])
	{
		d[v] = (d[u] ^ val[v]);
		get(v, u);
	}
}
lli cnt[24], pre[24][2], lg = 22;
void centroid(int u)
{
	dd[u] = 1;
    DFS(u, 0);
    vector<int> child;
    memset(pre, 0, sizeof pre);
    forinc(b, 0, lg)
    {
    	if(bit(val[u], b)) cnt[b]++;
    	pre[b][bit(val[u], b)]++;
    }
    for(int v : ke[u]) if(!dd[v])
	{
        tmp.clear();
        d[v] = val[v]; get(v, u);
        for(int w : tmp)
		{
			forinc(b, 0, lg)
			{
				if(bit(d[w], b)) cnt[b] += pre[b][0];
				else cnt[b] += pre[b][1];
			}
		}
        for(int w : tmp)
		{
			int value = (d[w] ^ val[u]);
			forinc(b, 0, lg) pre[b][bit(value, b)]++;
		}
		child.pb(Find(v, u, s[v]));
	}
	for(int w : child) centroid(w);
}
int main()
{
    if(fopen("input.txt","r"))
    {
        freopen("input.txt","r",stdin);
//        freopen("output.txt","w",stdout);
    }
    fastio;
	readInput();
	memset(dd, 0, sizeof dd);
	DFS(1, 0);
	centroid(Find(1, 0, n));
	lli ans = 0;
	forinc(i, 0, lg) ans += (1ll << i) * cnt[i];
	cout << ans;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
