제출 #1128509

#제출 시각아이디문제언어결과실행 시간메모리
1128509Alihan_8The Xana coup (BOI21_xanadu)C++20
100 / 100
112 ms39032 KiB
#include <bits/stdc++.h> using namespace std; using i64 = long long; void chmin(int &x, const int &y){ x = min(x, y); } int dp[100005][2][2]; signed main(){ int n; cin >> n; vector <vector<int>> adj(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); } vector <int> a(n); for ( auto &u: a ) cin >> u; for ( int i = 0; i < n; i++ ){ for ( int j = 0; j < 2; j++ ){ dp[i][j][0] = dp[i][j][1] = n + 1; } } auto dfs = [&](auto dfs, int u, int p) -> void{ vector <int> x(2, n + 1), y(2, n + 1); x[0] = y[0] = 0; for ( auto &v: adj[u] ){ if ( v != p ){ dfs(dfs, v, u); vector <int> xx(2), yy(2); for ( auto k: {0, 1} ){ xx[k] = min(dp[v][0][k] + x[0], dp[v][0][k ^ 1] + x[1]); yy[k] = min(dp[v][1][k] + y[0], dp[v][1][k ^ 1] + y[1]); } swap(xx, x), swap(yy, y); } } for ( auto k: {0, 1} ){ chmin(dp[u][a[u] ^ k][0], x[k]); chmin(dp[u][a[u] ^ k ^ 1][1], y[k] + 1); } }; dfs(dfs, 0, -1); int ans = min(dp[0][0][1], dp[0][0][0]); if ( ans == n + 1 ) return cout << "impossible\n", 0; cout << ans << '\n'; }
#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...