제출 #1089048

#제출 시각아이디문제언어결과실행 시간메모리
1089048VMaksimoski008The Xana coup (BOI21_xanadu)C++17
100 / 100
127 ms16980 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; vector<int> graph[maxn]; int n, vec[maxn], dp[maxn][2][2]; void dfs(int u, int p) { dp[u][vec[u]][0] = 0; dp[u][vec[u]^1][1] = 1; for(int &v : graph[u]) { if(v == p) continue; dfs(v, u); int tmp[2][2]; tmp[0][0] = tmp[0][1] = tmp[1][0] = tmp[1][1] = 1e9; for(int i=0; i<2; i++) for(int j=0; j<2; j++) for(int k=0; k<2; k++) tmp[i^j][k] = min(tmp[i^j][k], dp[u][i][k] + dp[v][k][j]); for(int i=0; i<2; i++) for(int j=0; j<2; j++) dp[u][i][j] = tmp[i][j]; } } int main() { cin >> n; for(int i=0; i<n-1; i++) { int a, b; cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); } for(int i=1; i<=n; i++) cin >> vec[i]; for(int i=1; i<=n; i++) dp[i][0][0] = dp[i][0][1] = dp[i][1][0] = dp[i][1][1] = 1e9; dfs(1, 1); int x = min(dp[1][0][0], dp[1][0][1]); if(x == 1e9) cout << "impossible"; else cout << x; return 0; }
#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...