Submission #1322366

#TimeUsernameProblemLanguageResultExecution timeMemory
1322366lopkusThe Xana coup (BOI21_xanadu)C++20
100 / 100
86 ms44172 KiB
#include <bits/stdc++.h>

#define int long long

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  int n;
  std::cin >> n;
  std::vector<int> adj[n + 1];
  for(int i = 1; i < n; i++) {
    int u, v;
    std::cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  std::vector<int> a(n + 1);
  for(int i = 1; i <= n; i++) {
    std::cin >> a[i];
  }
  std::function<int(std::vector<int>, std::vector<int>, int)> Solve = [] (std::vector<int> a, std::vector<int> b, int t) {
    int n = a.size();
    std::vector<std::vector<int>> dp(n + 1, std::vector<int>(2, 1e18));
    dp[0][1] = a[0];
    dp[0][0] = b[0];
    for(int i = 1; i < n; i++) {
      for(int mod = 0; mod < 2; mod++) {
        dp[i][mod] = std::min(dp[i - 1][mod ^ 1] + a[i], dp[i - 1][mod] + b[i]);
      }
    }
    return dp[n - 1][t];
  };
  int dp[n + 1][2][2];
  for(int i = 0; i <= n; i++) {
    for(int j = 0; j < 2; j++) {
      for(int k = 0; k < 2; k++) {
        dp[i][j][k] = n + 1;
      }
    }
  }
  std::function<void(int, int)> dfs = [&] (int v, int p) {
    for(auto u : adj[v]) {
      if(u != p) {
        dfs(u, v);
      }
    }
    if(adj[v].size() == 1 && v != 1) {
      dp[v][0][a[v]] = 0;
      dp[v][1][a[v] ^ 1] = 1;
      return;
    }
    std::vector<int> child;
    for(auto u : adj[v]) {
      if(u != p) {
        child.push_back(u);
      }
    }
    std::vector<int> c, d;
    for(int t = 0; t < 2; t++) {
      for(int is = 0; is < 2; is++) {
        if(t != a[v] && is == 0) {
          for(int i = 0; i < child.size(); i++) {
            int ch = child[i];
            c.push_back(dp[ch][1][0]);
            d.push_back(dp[ch][0][0]);
          }
          dp[v][is][t] = Solve(c, d, 1) + is;
          c.clear();
          d.clear();
        }
        else if(t != a[v] && is == 1) {
          for(int i = 0; i < child.size(); i++) {
            int ch = child[i];
            c.push_back(dp[ch][1][1]);
            d.push_back(dp[ch][0][1]);
          }
          dp[v][is][t] = Solve(c, d, 0) + is;
          c.clear();
          d.clear();
        }
        else if(t == a[v] && is == 0) {
          for(int i = 0; i < child.size(); i++) {
            int ch = child[i];
            c.push_back(dp[ch][1][0]);
            d.push_back(dp[ch][0][0]);
          }
          dp[v][is][t] = Solve(c, d, 0) + is;
          c.clear();
          d.clear();
        }
        else {
          for(int i = 0; i < child.size(); i++) {
            int ch = child[i];
            c.push_back(dp[ch][1][1]);
            d.push_back(dp[ch][0][1]);
          }
          dp[v][is][t] = Solve(c, d, 1) + is;
          c.clear();
          d.clear();
        }
      }
    }
  };
  dfs(1, 0);
  int ans = std::min(dp[1][0][0], dp[1][1][0]);
  if(ans > n) {
    std::cout << "impossible";
  }
  else {
    std::cout << ans;
  }
}
#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...