pb_jiang

E1

Sep 8th, 2025
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. void solve2()
  2. {
  3.     ll n, k;
  4.     cin >> n >> k;
  5.     vector<vl> g(n + 1);
  6.     for (ll i = 2, p; i <= n; ++i) {
  7.         cin >> p;
  8.         g[p].push_back(i);
  9.     }
  10.     vl dcnt(n);
  11.     ll min_leaf = LLONG_MAX / 2;
  12.     auto dfs = [&](auto &&self, ll u, ll depth) -> void {
  13.         dcnt[depth] += 1;
  14.         bool is_leaf = true;
  15.         for (auto v : g[u]) {
  16.             self(self, v, depth + 1);
  17.             is_leaf = false;
  18.         }
  19.         if (is_leaf)
  20.             min_leaf = min(min_leaf, depth);
  21.     };
  22.     dfs(dfs, 1, 0);
  23.  
  24.     ll d1 = min(k, n - k), d2 = max(k, n - k);
  25.     vl dp(d1 + 1);
  26.     dp[0] = d2;
  27.  
  28.     ll ans = 0;
  29.     for (ll i = 0; i <= min_leaf; ++i) {
  30.         ll v = dcnt[i];
  31.         vl ndp(dp);
  32.         for (auto &x : ndp)
  33.             x -= v;
  34.         for (ll j = v; j <= d1; ++j)
  35.             ndp[j] = max(ndp[j], dp[j - v]);
  36.  
  37.         swap(dp, ndp);
  38.         for (auto &x : dp)
  39.             if (x >= 0)
  40.                 ans = max(ans, i + 1);
  41.     }
  42.     cout << ans << '\n';
  43. }
  44.  
Advertisement
Add Comment
Please, Sign In to add comment