Submission #388626

#TimeUsernameProblemLanguageResultExecution timeMemory
388626phathnvSvjetlo (COCI20_svjetlo)C++11
110 / 110
422 ms91724 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 7; const int INF = 1e9 + 7; int n, dp[N][2][3], nxtDp[2][3], cnt[N]; string s; vector<int> adj[N]; void Dfs(int u, int p){ int state = s[u] - '0'; cnt[u] = (state == 0); for(int v : adj[u]){ if (v == p) continue; Dfs(v, u); cnt[u] += cnt[v]; } if (cnt[u] == 0) return; dp[u][state ^ 1][0] = 1; dp[u][state ^ 1][1] = 1; dp[u][state ^ 1][2] = 1; for(int v : adj[u]){ if (v == p || cnt[v] == 0) continue; memset(nxtDp, 0x3f, sizeof(nxtDp)); for(int s = 0; s < 2; s++){ nxtDp[s][0] = min(nxtDp[s][0], dp[u][s][1] + dp[v][1][1]); nxtDp[s][0] = min(nxtDp[s][0], dp[u][s ^ 1][1] + dp[v][0][1] + 2); nxtDp[s][0] = min(nxtDp[s][0], dp[u][s][2] + dp[v][0][0] + 1); nxtDp[s][0] = min(nxtDp[s][0], dp[u][s ^ 1][2] + dp[v][1][0] + 3); nxtDp[s][0] = min(nxtDp[s][0], dp[u][s ^ 1][0] + dp[v][1][2] + 1); nxtDp[s][0] = min(nxtDp[s][0], dp[u][s][0] + dp[v][0][2] + 3); nxtDp[s][1] = min(nxtDp[s][1], dp[u][s ^ 1][1] + dp[v][1][2] + 1); nxtDp[s][1] = min(nxtDp[s][1], dp[u][s][1] + dp[v][0][2] + 3); nxtDp[s][1] = min(nxtDp[s][1], dp[u][s][2] + dp[v][1][1]); nxtDp[s][1] = min(nxtDp[s][1], dp[u][s ^ 1][2] + dp[v][0][1] + 2); nxtDp[s][2] = min(nxtDp[s][2], dp[u][s ^ 1][2] + dp[v][1][2] + 1); nxtDp[s][2] = min(nxtDp[s][2], dp[u][s][2] + dp[v][0][2] + 3); } for(int s = 0; s < 2; s++) for(int i = 1; i >= 0; i--) nxtDp[s][i] = min(nxtDp[s][i], nxtDp[s][i + 1]); for(int s = 0; s < 2; s++) for(int i = 0; i < 3; i++) dp[u][s][i] = nxtDp[s][i]; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> s; s = '*' + s; for(int i = 1; i < n; i++){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } memset(dp, 0x3f, sizeof(dp)); int root = 1; while (s[root] == '1') root++; Dfs(root, -1); cout << dp[root][1][0]; 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...