pb_jiang

solve2 for E1; solve3 for E2

Sep 8th, 2025
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.58 KB | None | 0 0
  1. // Problem: E1. Maple and Tree Beauty (Easy Version)
  2. // Contest: Codeforces - Codeforces Round 1048 (Div. 2)
  3. // URL: https://codeforces.com/contest/2139/problem/E1
  4. // Memory Limit: 1024 MB
  5. // Time Limit: 3000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. using namespace std;
  12. #ifndef __DEBUG__
  13. #define dbg(...) 42
  14. #endif
  15. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  16.  
  17. namespace rngs = std::ranges;
  18. using ll = long long;
  19. using a2l = array<ll, 2>;
  20. using vl = vector<ll>;
  21.  
  22. void solve2()
  23. {
  24.     ll n, k;
  25.     cin >> n >> k;
  26.     vector<vl> g(n + 1);
  27.     for (ll i = 2, p; i <= n; ++i) {
  28.         cin >> p;
  29.         g[p].push_back(i);
  30.     }
  31.     vl dcnt(n);
  32.     ll min_leaf = LLONG_MAX / 2;
  33.     auto dfs = [&](auto &&self, ll u, ll depth) -> void {
  34.         dcnt[depth] += 1;
  35.         bool is_leaf = true;
  36.         for (auto v : g[u]) {
  37.             self(self, v, depth + 1);
  38.             is_leaf = false;
  39.         }
  40.         if (is_leaf)
  41.             min_leaf = min(min_leaf, depth);
  42.     };
  43.     dfs(dfs, 1, 0);
  44.  
  45.     ll d1 = min(k, n - k), d2 = max(k, n - k);
  46.     vl dp(d1 + 1);
  47.     dp[0] = d2;
  48.  
  49.     ll ans = 0;
  50.     for (ll i = 0; i <= min_leaf; ++i) {
  51.         ll v = dcnt[i];
  52.         vl ndp(dp);
  53.         for (auto &x : ndp)
  54.             x -= v;
  55.         for (ll j = v; j <= d1; ++j)
  56.             ndp[j] = max(ndp[j], dp[j - v]);
  57.  
  58.         swap(dp, ndp);
  59.         for (auto &x : dp)
  60.             if (x >= 0)
  61.                 ans = max(ans, i + 1);
  62.     }
  63.     cout << ans << '\n';
  64. }
  65.  
  66. constexpr ll maxn = 2e5 + 3;
  67. template <ll dlen = 1> ll calc(ll d1, ll d2, const vl &dcnt, ll min_leaf)
  68. {
  69.     if (dlen <= d1) {
  70.         return calc<min(2 * dlen, maxn)>(d1, d2, dcnt, min_leaf);
  71.     }
  72.  
  73.     bitset<dlen> bs;
  74.     bs[0] = true;
  75.     ll ans = 0;
  76.     map<ll, ll> cnt;
  77.     for (ll i = 0; i <= min_leaf; ++i)
  78.         cnt[dcnt[i]] += 1;
  79.  
  80.     vl opt;
  81.     for (auto [k, v] : cnt) {
  82.         for (ll i = 1; i <= v; i <<= 1) {
  83.             opt.push_back(k * i);
  84.             v -= i;
  85.         }
  86.         if (v)
  87.             opt.push_back(k * v);
  88.     }
  89.  
  90.     ll sum = 0;
  91.     for (auto v : opt) {
  92.         sum += v;
  93.         bs = bs | (bs << v);
  94.     }
  95.  
  96.     if (sum <= d1 || sum <= d2)
  97.         return min_leaf + 1;
  98.     for (ll i = min(max(0ll, sum - d2), d1); i <= d1; ++i)
  99.         if (bs[i])
  100.             return min_leaf + 1;
  101.  
  102.     return min_leaf;
  103. };
  104. void solve3()
  105. {
  106.     ll n, k;
  107.     cin >> n >> k;
  108.     vector<vl> g(n + 1);
  109.     for (ll i = 2, p; i <= n; ++i) {
  110.         cin >> p;
  111.         g[p].push_back(i);
  112.     }
  113.     vl dcnt(n);
  114.     ll min_leaf = LLONG_MAX / 2;
  115.     auto dfs = [&](auto &&self, ll u, ll depth) -> void {
  116.         dcnt[depth] += 1;
  117.         bool is_leaf = true;
  118.         for (auto v : g[u]) {
  119.             self(self, v, depth + 1);
  120.             is_leaf = false;
  121.         }
  122.         if (is_leaf)
  123.             min_leaf = min(min_leaf, depth);
  124.     };
  125.     dfs(dfs, 1, 0);
  126.  
  127.     ll ans = calc(min(k, n - k), max(k, n - k), dcnt, min_leaf);
  128.     cout << ans << '\n';
  129. }
  130.  
  131. void solve()
  132. {
  133.     ll n, k;
  134.     cin >> n >> k;
  135.     vector<vl> g(n + 1);
  136.     for (ll i = 2, p; i <= n; ++i) {
  137.         cin >> p;
  138.         g[p].push_back(i);
  139.     }
  140.     vl dcnt(n);
  141.     ll min_leaf = LLONG_MAX / 2;
  142.     auto dfs = [&](auto &&self, ll u, ll depth) -> void {
  143.         dcnt[depth] += 1;
  144.         bool is_leaf = true;
  145.         for (auto v : g[u]) {
  146.             self(self, v, depth + 1);
  147.             is_leaf = false;
  148.         }
  149.         if (is_leaf)
  150.             min_leaf = min(min_leaf, depth);
  151.     };
  152.     dfs(dfs, 1, 0);
  153.     ll ans = 0;
  154.  
  155.     vector<vl> dp(n - k + 1, vl(k + 1, LLONG_MIN / 2));
  156.     dp[0][0] = 0;
  157.     auto search = [&](auto &&self, ll sid, ll r1, ll r2) -> ll {
  158.         if (sid > min_leaf || dcnt[sid] == 0)
  159.             return 0;
  160.         if (r1 < dcnt[sid] && r2 < dcnt[sid])
  161.             return 0;
  162.         if (dp[r1][r2] != LLONG_MIN / 2)
  163.             return dp[r1][r2];
  164.         ll res = 0;
  165.         if (r1 >= dcnt[sid]) {
  166.             ll branch = self(self, sid + 1, r1 - dcnt[sid], r2) + 1;
  167.             res = max(res, branch);
  168.         }
  169.         if (r2 >= dcnt[sid]) {
  170.             ll branch = self(self, sid + 1, r1, r2 - dcnt[sid]) + 1;
  171.             res = max(res, branch);
  172.         }
  173.         ans = max(ans, res);
  174.         return dp[r1][r2] = res;
  175.     };
  176.  
  177.     search(search, 0, n - k, k);
  178.  
  179.     cout << ans << '\n';
  180. }
  181.  
  182. int main(int argc, char **argv)
  183. {
  184.     std::ios::sync_with_stdio(false);
  185.     std::cin.tie(nullptr);
  186.  
  187.     ll t = 1;
  188.     cin >> t;
  189.     while (t--)
  190.         solve3();
  191.  
  192.     return 0;
  193. };
  194.  
Advertisement
Add Comment
Please, Sign In to add comment