ARC083E. Bichrome Tree

A viable configuration of the given tree can be divided into two trees, each consists of vertices of the same color. Let's call them $T_B$ and $T_W$, respectively. Note that $T_B$ and $T_W$ are independent of each other with respect to satisfying the conditions. For each vertex $u$ in $T_A$, it must hold that the total weight of $u$'s proper descendants is no more than $X_u$, and in that case it is always possible make the total weight of vertices in subtree $u$ be $X_u$ by setting $u$'s weight appropriately. The same can be said for $T_B$. Ideally, we can configure the given tree such that in each subtree $u$, the total weight of vertices with a different color than $u$ are minimized.

Official editorial:

The hard part of this problem is to understand the highlighted sentence.

code
 
int main() {
  int n;
  scan(n);
  vv
   
   
    
     g(n);
  rng (i, 1, n) {
    int p;
    scan(p);
    g[p - 1].pb(i);
  }
  vi x(n);
  scan(x);
  vi dp(n);
  function
    
    
     
      dfs = [&](int u) {
    vi f(x[u] + 1, INT_MAX);
    f[0] = 0;
    FOR (v, g[u]) {
      dfs(v);
      down (i, x[u], 0) {
        if (f[i] != INT_MAX) {
          int t = f[i];
          f[i] = INT_MAX;
          if (i + x[v] <= x[u]) {
            chkmin(f[i + x[v]], t + dp[v]);
          }
          if (i + dp[v] <= x[u]) {
            chkmin(f[i + dp[v]], t + x[v]);
          }
        }
      }
      dp[u] = *min_element(all(f));
      if (dp[u] == INT_MAX) {
        println("IMPOSSIBLE");
        exit(0);
      }
    }
  };

  dfs(0);

  println("POSSIBLE");
  return 0;
}

    
    
   
    

I find this editorial in Chinese helpful.

猜你喜欢

转载自www.cnblogs.com/Patt/p/11914922.html
今日推荐