제출 #760975

#제출 시각아이디문제언어결과실행 시간메모리
760975ND0322The Xana coup (BOI21_xanadu)C++17
100 / 100
104 ms16532 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5+5; const int INF = 1e5+10; int dp[MAXN][2][2],temp[2][2],n; bool state[MAXN]; vector<int> adj[MAXN]; //let dp[u][p][t] be the minimum number of moves to turn off node u and its subtree where p is true if the parent toggled their bulb and false otherwise, t is if we intend to toggle the current nod void dfs(int node, int par){ for(int i = 0; i <= 1; i++){ dp[node][i][state[node] ^ i] = i; dp[node][i][state[node] ^ i ^ 1] = INF; } for(int child:adj[node]){ if(child == par) continue; dfs(child,node); for(int i = 0; i <= 1; i++){ int odd = dp[node][i][1]; int even = dp[node][i][0]; dp[node][i][0] = min({INF, even + dp[child][0][i], odd + dp[child][1][i]}); dp[node][i][1] = min({INF, even + dp[child][1][i], odd + dp[child][0][i]}); } } } int main() { cin >> n; for(int i = 0; i < n-1; i++){ int x,y; cin >> x >> y; adj[x].push_back(y); adj[y].push_back(x); } for(int i = 1; i <= n; i ++){ cin >> state[i]; } dfs(1,-1); int ans = min(dp[1][0][0],dp[1][1][0]); if(ans >= INF){ cout << "impossible\n"; } else{ 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...