Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void solve2()
- {
- ll n, k;
- cin >> n >> k;
- vector<vl> g(n + 1);
- for (ll i = 2, p; i <= n; ++i) {
- cin >> p;
- g[p].push_back(i);
- }
- vl dcnt(n);
- ll min_leaf = LLONG_MAX / 2;
- auto dfs = [&](auto &&self, ll u, ll depth) -> void {
- dcnt[depth] += 1;
- bool is_leaf = true;
- for (auto v : g[u]) {
- self(self, v, depth + 1);
- is_leaf = false;
- }
- if (is_leaf)
- min_leaf = min(min_leaf, depth);
- };
- dfs(dfs, 1, 0);
- ll d1 = min(k, n - k), d2 = max(k, n - k);
- vl dp(d1 + 1);
- dp[0] = d2;
- ll ans = 0;
- for (ll i = 0; i <= min_leaf; ++i) {
- ll v = dcnt[i];
- vl ndp(dp);
- for (auto &x : ndp)
- x -= v;
- for (ll j = v; j <= d1; ++j)
- ndp[j] = max(ndp[j], dp[j - v]);
- swap(dp, ndp);
- for (auto &x : dp)
- if (x >= 0)
- ans = max(ans, i + 1);
- }
- cout << ans << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment