제출 #1228341

#제출 시각아이디문제언어결과실행 시간메모리
1228341countlessThe Xana coup (BOI21_xanadu)C++20
100 / 100
45 ms13896 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define sp <<" "<< #define endl "\n" const int MAXN = 1e5; const int INF = 1e9+5; int n; vector<int> val; vector<vector<int>> adj; int dp[MAXN][2][2]; void dfs(int u, int p = -1) { for (int f = 0; f < 2; f++) { dp[u][f][val[u] ^ f] = f; dp[u][f][val[u] ^ f ^ 1] = INF; } for (auto &v : adj[u]) { if (v == p) continue; dfs(v, u); for (int f = 0; f < 2; f++) { int o0 = dp[u][f][0], o1 = dp[u][f][1]; dp[u][f][0] = min({INF, o0 + dp[v][0][f], o1 + dp[v][1][f]}); dp[u][f][1] = min({INF, o0 + dp[v][1][f], o1 + dp[v][0][f]}); } } } void solve() { cin >> n; val.resize(n); adj.assign(n, {}); for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 0; i < n; i++) { cin >> val[i]; } int root = 0; dfs(root); int ans = min(dp[root][0][0], dp[root][1][0]); cout << (ans > n ? "impossible" : to_string(ans)) << endl; } signed main() { cin.tie(0); ios_base::sync_with_stdio(false); int t = 1; // cin >> t; while (t--) solve(); }
#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...