Submission #1322366

#TimeUsernameProblemLanguageResultExecution timeMemory
1322366lopkusThe Xana coup (BOI21_xanadu)C++20
100 / 100
86 ms44172 KiB
#include <bits/stdc++.h> #define int long long signed main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int n; std::cin >> n; std::vector<int> adj[n + 1]; for(int i = 1; i < n; i++) { int u, v; std::cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } std::vector<int> a(n + 1); for(int i = 1; i <= n; i++) { std::cin >> a[i]; } std::function<int(std::vector<int>, std::vector<int>, int)> Solve = [] (std::vector<int> a, std::vector<int> b, int t) { int n = a.size(); std::vector<std::vector<int>> dp(n + 1, std::vector<int>(2, 1e18)); dp[0][1] = a[0]; dp[0][0] = b[0]; for(int i = 1; i < n; i++) { for(int mod = 0; mod < 2; mod++) { dp[i][mod] = std::min(dp[i - 1][mod ^ 1] + a[i], dp[i - 1][mod] + b[i]); } } return dp[n - 1][t]; }; int dp[n + 1][2][2]; for(int i = 0; i <= n; i++) { for(int j = 0; j < 2; j++) { for(int k = 0; k < 2; k++) { dp[i][j][k] = n + 1; } } } std::function<void(int, int)> dfs = [&] (int v, int p) { for(auto u : adj[v]) { if(u != p) { dfs(u, v); } } if(adj[v].size() == 1 && v != 1) { dp[v][0][a[v]] = 0; dp[v][1][a[v] ^ 1] = 1; return; } std::vector<int> child; for(auto u : adj[v]) { if(u != p) { child.push_back(u); } } std::vector<int> c, d; for(int t = 0; t < 2; t++) { for(int is = 0; is < 2; is++) { if(t != a[v] && is == 0) { for(int i = 0; i < child.size(); i++) { int ch = child[i]; c.push_back(dp[ch][1][0]); d.push_back(dp[ch][0][0]); } dp[v][is][t] = Solve(c, d, 1) + is; c.clear(); d.clear(); } else if(t != a[v] && is == 1) { for(int i = 0; i < child.size(); i++) { int ch = child[i]; c.push_back(dp[ch][1][1]); d.push_back(dp[ch][0][1]); } dp[v][is][t] = Solve(c, d, 0) + is; c.clear(); d.clear(); } else if(t == a[v] && is == 0) { for(int i = 0; i < child.size(); i++) { int ch = child[i]; c.push_back(dp[ch][1][0]); d.push_back(dp[ch][0][0]); } dp[v][is][t] = Solve(c, d, 0) + is; c.clear(); d.clear(); } else { for(int i = 0; i < child.size(); i++) { int ch = child[i]; c.push_back(dp[ch][1][1]); d.push_back(dp[ch][0][1]); } dp[v][is][t] = Solve(c, d, 1) + is; c.clear(); d.clear(); } } } }; dfs(1, 0); int ans = std::min(dp[1][0][0], dp[1][1][0]); if(ans > n) { std::cout << "impossible"; } else { std::cout << ans; } }
#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...