Submission #673661

#TimeUsernameProblemLanguageResultExecution timeMemory
673661stanislavpolynThe Xana coup (BOI21_xanadu)C++17
100 / 100
89 ms15016 KiB
#include <bits/stdc++.h> #define fr(i, a, b) for (int i = (a); i <= (b); ++i) #define rf(i, a, b) for (int i = (a); i >= (b); --i) #define fe(x, y) for (auto& x : y) #define fi first #define se second #define pb push_back #define mp make_pair #define mt make_tuple #define all(x) (x).begin(), (x).end() #define pw(x) (1LL << (x)) #define sz(x) (int)(x).size() using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define fbo find_by_order #define ook order_of_key template <typename T> bool umn(T& a, T b) { return (a > b ? (a = b, 1) : 0); } template <typename T> bool umx(T& a, T b) { return (a < b ? (a = b, 1) : 0); } using ll = long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; template <typename T> using ve = vector<T>; const int N = 1e5 + 5; int n; ve<int> g[N]; bool a[N]; int dp[N][2][2]; void dfs(int v, int p) { bool leaf = 1; fe (to, g[v]) { if (to == p) continue; dfs(to, v); leaf = 0; } if (leaf) { dp[v][a[v]][0] = 0; dp[v][!a[v]][1] = 1; return; } // cout << dp[v][0][1] << "\n"; // don't press ve<int> dp(2, 1e9), ndp(2, 1e9); dp[a[v]] = 0; fe (to, g[v]) { if (to == p) continue; fr (was, 0, 1) { umn(ndp[was ^ 1], dp[was] + ::dp[to][0][1]); umn(ndp[was], dp[was] + ::dp[to][0][0]); } fr (was, 0, 1) { dp[was] = ndp[was]; ndp[was] = 1e9; } } umn(::dp[v][0][0], dp[0]); umn(::dp[v][1][0], dp[1]); fill(all(dp), 1e9); fill(all(ndp), 1e9); // press dp[!a[v]] = 1; fe (to, g[v]) { if (to == p) continue; fr (was, 0, 1) { umn(ndp[was ^ 1], dp[was] + ::dp[to][1][1]); umn(ndp[was], dp[was] + ::dp[to][1][0]); } fr (was, 0, 1) { dp[was] = ndp[was]; ndp[was] = 1e9; } } umn(::dp[v][0][1], dp[0]); umn(::dp[v][1][1], dp[1]); // cout << v << " " << ::dp[v][0][0] << " " << ::dp[v][0][1] << " " << ::dp[v][1][0] << " " << ::dp[v][1][1] << "\n"; } int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #else ios::sync_with_stdio(0); cin.tie(0); #endif cin >> n; fr (i, 1, n - 1) { int a, b; cin >> a >> b; g[a].pb(b); g[b].pb(a); } fr (i, 1, n) { cin >> a[i]; } fr (i, 1, n) { fr (j, 0, 1) { fr (k, 0, 1) { dp[i][j][k] = 1e9; } } } dfs(1, -1); int best = 1e9; fr (i, 0, 1) { umn(best, dp[1][0][i]); } if (best == 1e9) { cout << "impossible\n"; return 0; } cout << best << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...