Submission #1287933

#TimeUsernameProblemLanguageResultExecution timeMemory
1287933behradThe Xana coup (BOI21_xanadu)C++17
100 / 100
91 ms26624 KiB
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 1e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<int, int> pii;

int n, dp[maxn][2][2], a[maxn];
vector<int> g[maxn];

void dfs(int v, int p = 0) {
  vector<int> ch;
  for (int u : g[v]) {
    if (u != p) {
      dfs(u, v);
      ch.pb(u);
    }
  }

  if (ch.empty()) {
    dp[v][0][0] = 0;
    dp[v][1][1] = 1;
    return;
  }

  for (int val = 0; val < 2; ++val) {
    vector<int> pd(2, 2 * n);
    pd[val] = val;
    
    for (auto u : ch) {
      vector<int> cur(2, 2 * n);
      for (int i : {0, 1})
        for (int t : {0, 1})
          for (int s : {0, 1})
            if (s ^ val == a[u]) cur[i ^ t] = min(cur[i ^ t], pd[i] + dp[u][t][s]); 
          
      pd.swap(cur);
    }

    dp[v][val][0] = min(dp[v][val][0], pd[0]);
    dp[v][val][1] = min(dp[v][val][1], pd[1]);
  }
}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0); 
  memset(dp, 31, sizeof dp);
  cin >> n;
  for (int i = 1 , u, v ; i < n ; i ++) {
    cin >> u >> v;
    g[u].pb(v);
    g[v].pb(u);
  }
  for (int i = 1 ; i <= n ; i ++) cin >> a[i];
  dfs(1);

  int res = min(dp[1][0][a[1]], dp[1][1][a[1]]);
  if (res > n) cout << "impossible\n";
  else cout << res << nl;
}
#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...