int n, cnt; int a[kMaxN], sz[kMaxN]; std::vector<int> g[kMaxN], G[kMaxN];
boolnand(bool a, bool b){ return !(a & b); }
voiddfs(int u, int fa){ sz[u] = 1; for (auto v : G[u]) { if (v == fa) continue; dfs(v, u); sz[u] += sz[v]; } cnt += __builtin_ctz(sz[u]); }
boolsolve(int del = 0){ int ret = 0, tot = 0; for (int i = 1; i <= n - (bool)del; ++i) tot += __builtin_ctz(i); // std::cerr << n << ' ' << tot << '\n'; for (int i = 1; i <= n; ++i) { if (i != del && a[i]) { cnt = 0, dfs(i, 0); // assert(cnt <= tot); ret ^= (cnt == tot); } } return ret; }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i < n; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); g[u].emplace_back(v), g[v].emplace_back(u); } for (int i = 1; i <= n; ++i) std::cin >> a[i]; bool ans = 0; if (n & 1) { ans ^= solve(); } else { for (int u = 1; u <= n; ++u) { for (auto v : g[u]) { if (u > v) continue; for (int i = 1; i <= n; ++i) G[i].clear(); for (auto i : g[u]) if (i != v) G[u].emplace_back(i); for (auto i : g[v]) if (i != u) G[u].emplace_back(i); for (int i = 1; i <= n; ++i) { if (i == u || i == v) continue; for (auto j : g[i]) { if (j == u || j == v) G[i].emplace_back(u); else G[i].emplace_back(j); } } int lst = a[u]; a[u] = nand(a[u], a[v]), ans ^= solve(v), a[u] = lst; } } } std::cout << ans << '\n'; }