int n, ans; int a[kMaxN]; std::vector<int> G[kMaxN]; std::priority_queue<int> q[kMaxN];
voiddfs(int u, int fa){ for (auto v : G[u]) { if (v == fa) continue; dfs(v, u); if (q[u].size() < q[v].size()) q[u].swap(q[v]); for (; !q[v].empty(); q[v].pop()) q[u].emplace(q[v].top()); } for (; q[u].size() > 1 && a[u] < q[u].top();) { int x = q[u].top(); q[u].pop(); int y = q[u].top(); q[u].pop(); a[u] = a[u] - x + y; } if (q[u].size() == 1 && a[u] < q[u].top()) { ans += ((~n & 1) ? 1 : -1) * (a[u] - q[u].top()); q[u].pop(); } else { q[u].emplace(a[u]); } }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i], ans += a[i]; for (int i = 1; i < n; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); } dfs(1, 0); for (int o = 1; !q[1].empty(); q[1].pop(), o = -o) ans += o * q[1].top(); std::cout << ans / 2 << '\n'; }