Submission #1302785

#TimeUsernameProblemLanguageResultExecution timeMemory
1302785mat_jurSvjetlo (COCI20_svjetlo)C++20
0 / 110
2098 ms53572 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]; node() { dp[0][0] = dp[0][1] = dp[1][0] = dp[1][1] = inf; } node(int x) { dp[1-x][0] = dp[1-x][1] = 1; dp[x][1] = 0; dp[x][0] = inf; } friend ostream& operator << (auto &os, const node &a) { return os << "{{" << a.dp[0][0] << ", " << a.dp[0][1] << "}, {" << a.dp[1][0] << ", " << a.dp[1][1] << "}}"; } }; node comb(const node &a, const node &b) { node 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 (!j && !y) { // res.dp[col][1] = min(res.dp[col][1], a.dp[i][j] + b.dp[x][y]); // res.dp[col^1][1] = min(res.dp[col^1][1], a.dp[i][j] + b.dp[x][y] + 2`); // } 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 && !y) res.dp[col][1] = min(res.dp[col][1], a.dp[i][j] + b.dp[x][y]); add++; col ^= 1; res.dp[col][j] = min(res.dp[col][j], a.dp[i][j] + b.dp[x][y] + add); } } } } } return res; } void dfs(int v, int p, const vector<vector<int>> &g, vector<node> &dp) { for (int u : g[v]) { if (u == p) continue; dfs(u, v, g, dp); dp[v] = comb(dp[v], dp[u]); } debug(v); debug(dp[v]); } int solve_dp(int s, const vector<vector<int>> &g, const vector<int> &c) { int n = ssize(g); vector<node> dp(n); for (int i = 0; i < n; ++i) dp[i] = node(c[i]); debug(s); dfs(s, -1, g, dp); cerr << endl; return min(dp[s].dp[1][0], dp[s].dp[1][1]); } 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'); } 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) res = min(res, solve_dp(i, g, c)); 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...