제출 #1324009

#제출 시각아이디문제언어결과실행 시간메모리
1324009maxiedThe Xana coup (BOI21_xanadu)C++20
100 / 100
54 ms28092 KiB
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	cin >> n;
	vector<vector<int>> adj(n);
	for (int i = 0, u, v; i < n - 1; i++){
		cin >> u >> v;
		u--, v--;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	vector<int> t(n);
	for (int i = 0; i < n; i++){
		cin >> t[i];
	}
	vector<vector<vector<i64>>> dp(2, vector<vector<i64>>(2, vector<i64>(n, 3e5)));
	auto dfs = [&](auto &&me, int u, int p) -> void{
		for (int v : adj[u]){
			if (v == p){
				continue;
			}
			me(me, v, u);
		}
		for (int tg = 0; tg < 2; tg++){
			for (int fl = 0; fl < 2; fl++){
				vector<i64> d;
				i64 tot = 0;
				int chg = t[u] ^ tg ^ fl;
				for (int v : adj[u]){
					if (v == p){
						continue;
					}
					tot += dp[fl][0][v];
					d.push_back(dp[fl][1][v] - dp[fl][0][v]);
				}
				if (d.empty()){
					dp[tg][fl][u] = (chg ? 3e5 : tot) + fl;
					continue;
				}
				sort(d.begin(), d.end());
				int take = 0;
				i64 ans = 3e5;
				while (take < chg){
					tot += d[take];
					take++;
				}
				ans = min(ans, tot);
				while (take + 1 < d.size()){
					tot += d[take] + d[take + 1];
					take += 2;
					ans = min(ans, tot);
				}
				dp[tg][fl][u] = ans + fl;
			}
		}
	};
	dfs(dfs, 0, 0);
	i64 res = min(dp[0][0][0], dp[0][1][0]);
	if (res >= 2e5){
		cout << "impossible";
	}
	else{
		cout << res;
	}
}
#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...