Submission #676379

#TimeUsernameProblemLanguageResultExecution timeMemory
676379YENGOYANThe Xana coup (BOI21_xanadu)C++17
0 / 100
83 ms26820 KiB
/*
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\
    \\                                    //
    //  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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...