This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\
\\ //
// 271828___182845__904523__53602__ \\
\\ 87___47____13______52____66__24_ //
// 97___75____72______47____09___36 \\
\\ 999595_____74______96____69___67 //
// 62___77____24______07____66__30_ \\
\\ 35___35____47______59____45713__ //
// \\
\\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\//
*/
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_map>
#include <cmath>
#include <climits>
#include <algorithm>
#include <random>
#include <queue>
#include <deque>
#include <iomanip>
#include <string>
#include <tuple>
#include <bitset>
#include <chrono>
#include <ctime>
#include <fstream>
#include <stack>
#include <cstdio>
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
const ll mod = 1e9 + 7, inf = 1e18;
int n;
vector<vector<int>> tree;
vector<int> vec;
vector<vector<ll>> dp;
void dfs(int u, int p) {
for (int v : tree[u]) {
if (v != p) dfs(v, u);
}
ll ans = 0, ans1 = 0;
vector<ll> delta;
for (int v : tree[u]) {
if (v != p)
{
ans += min(dp[v][0], dp[v][1]);
ans1 += dp[v][1];
}
}
if (!vec[u]) {
ll cur = 0;
for (int v : tree[u]) {
//if (v == p) continue;
if (v != p)
{
delta.push_back(dp[v][1] - dp[v][0]);
cur += dp[v][0];
}
}
sort(delta.begin(), delta.end());
for (int i = 1; i < delta.size(); i += 2) {
if (delta[i] + delta[i - 1] <= 0) cur += delta[i] + delta[i - 1];
}
dp[u][0] = cur;
}
else {
ll cur = 0;
for (int v : tree[u]) {
if (v == p) continue;
delta.push_back(dp[v][1] - dp[v][0]);
cur += dp[v][0];
}
sort(delta.begin(), delta.end());
if (!delta.size()) {
dp[u][0] = 2e15;
//return;
}
else {
cur += delta[0];
for (int i = 1; i < delta.size() - 1; i += 2) {
if (0 >= delta[i] + delta[i + 1]) {
cur += delta[i] + delta[i + 1];
}
}
dp[u][0] = cur;
}
}
cout << u + 1 << " : " << dp[u][0] << " " << dp[u][1] << "\n";
// dp[u][0]
}
void solve() {
cin >> n;
vec = vector<int>(n);
tree = vector<vector<int>>(n);
dp = vector<vector<ll>>(n, vector<ll>(2));
//sub = vector<int>(n);
for (int i = 1; i < n; ++i) {
int u, v; cin >> u >> v;
tree[--u].push_back(--v);
tree[v].push_back(u);
}
for (int i = 0; i < n; ++i) cin >> vec[i];
//return;
//fnd_sub(0, -1);
dfs(0, -1);
cout << dp[0][0] << " " << dp[0][1] << "\n";
cout << min(dp[0][0], dp[0][1]) << "\n";
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
//int ; cin >> _; while (--)
solve();
}
Compilation message (stderr)
xanadu.cpp: In function 'void dfs(int, int)':
xanadu.cpp:71:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
71 | for (int i = 1; i < delta.size(); i += 2) {
| ~~^~~~~~~~~~~~~~
xanadu.cpp:90:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
90 | for (int i = 1; i < delta.size() - 1; i += 2) {
| ~~^~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |