Submission #1302925

#TimeUsernameProblemLanguageResultExecution timeMemory
1302925mat_jurSvjetlo (COCI20_svjetlo)C++20
20 / 110
2097 ms59584 KiB
#include "bits/stdc++.h" using namespace std; #ifdef DEBUG auto&operator<<(auto &o, pair<auto, auto> p) {o << "(" << p.first << ", " << p.second << ")"; return o;} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{"; for(auto e : x) o<<e<<", "; return o<<"}";} #define debug(X) cerr << "["#X"]: " << X << '\n'; #else #define cerr if(0)cout #define debug(X) ; #endif using ll = long long; #define all(v) (v).begin(), (v).end() #define ssize(x) int(x.size()) #define fi first #define se second #define mp make_pair #define eb emplace_back const int inf = 1e9; struct node { int dp[2][2]; bool skip; node() { dp[0][0] = dp[0][1] = dp[1][0] = dp[1][1] = inf; skip = false; } node(int x) { dp[1-x][0] = dp[1-x][1] = 1; dp[x][1] = 0; dp[x][0] = inf; skip = bool(x); } }; node comb(const node &a, const node &b) { node res; res.skip = a.skip && b.skip; if (res.skip) return res; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { for (int x = 0; x < 2; ++x) { for (int y = 0; y < 2; ++y) { if (j && y) continue; int col = i, add = 0; if (!x) { col ^= 1; add += 2; } if (y) { res.dp[col][1] = min(res.dp[col][1], a.dp[i][j] + b.dp[x][y] + add); } else { if (!j) res.dp[col][1] = min(res.dp[col][1], a.dp[i][j] + b.dp[x][y] + add); add++; col ^= 1; res.dp[col][j] = min(res.dp[col][j], a.dp[i][j] + b.dp[x][y] + add); } } } } } return res; } node calc_dp(int v, int p, const vector<vector<int>> &g, const vector<node> &dp, const vector<int> &c) { node res(c[v]); for (int u : g[v]) { if (u == p) continue; if (!dp[u].skip) res = comb(res, dp[u]); } return res; } void dfs(int v, int p, const vector<vector<int>> &g, vector<node> &dp, const vector<int> &c) { for (int u : g[v]) { if (u == p) continue; dfs(u, v, g, dp, c); } dp[v] = calc_dp(v, p, g, dp, c); } vector<node> solve_dp(int s, const vector<vector<int>> &g, const vector<int> &c) { int n = ssize(g); vector<node> dp(n); dfs(s, -1, g, dp, c); return dp; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> c(n); vector<vector<int>> g(n); for (int i = 0; i < n; ++i) { char x; cin >> x; c[i] = int(x - '0'); } debug(c); for (int i = 0; i < n-1; ++i) { int u, v; cin >> u >> v; g[u-1].eb(v-1); g[v-1].eb(u-1); } int res = inf; for (int i = 0; i < n; ++i) { vector<node> dp = solve_dp(i, g, c); // reroot dfs(0, -1, g, dp, c); res = min(res, min(dp[i].dp[1][0], dp[i].dp[1][1])); } cout << res << '\n'; 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...