pb_jiang

solve2 for E1; solve3 for E2

Sep 8th, 2025
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 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 n, ll k, const vl &dcnt, ll min_leaf)
  68. {
  69.     if (dlen <= k) {
  70.         return calc<min(2 * dlen, maxn)>(n, k, dcnt, min_leaf);
  71.     }
  72.  
  73.     bitset<dlen> bs;
  74.     bs[0] = true;
  75.     ll ans = 0;
  76.     for (ll i = 0, sum = 0; i <= min_leaf; ++i) {
  77.         ll v = dcnt[i];
  78.         sum += v;
  79.         bs = bs | (bs << v);
  80.         bool valid = false;
  81.         for (ll j = min(max(0ll, sum - (n - k)), k); j <= k; ++j) {
  82.             if (bs[j])
  83.                 ans = max(ans, i + 1);
  84.         }
  85.     }
  86.     return ans;
  87. };
  88. void solve3()
  89. {
  90.     ll n, k;
  91.     cin >> n >> k;
  92.     vector<vl> g(n + 1);
  93.     for (ll i = 2, p; i <= n; ++i) {
  94.         cin >> p;
  95.         g[p].push_back(i);
  96.     }
  97.     vl dcnt(n);
  98.     ll min_leaf = LLONG_MAX / 2;
  99.     auto dfs = [&](auto &&self, ll u, ll depth) -> void {
  100.         dcnt[depth] += 1;
  101.         bool is_leaf = true;
  102.         for (auto v : g[u]) {
  103.             self(self, v, depth + 1);
  104.             is_leaf = false;
  105.         }
  106.         if (is_leaf)
  107.             min_leaf = min(min_leaf, depth);
  108.     };
  109.     dfs(dfs, 1, 0);
  110.  
  111.     ll ans = calc(n, k, dcnt, min_leaf);
  112.     cout << ans << '\n';
  113. }
  114.  
  115. void solve()
  116. {
  117.     ll n, k;
  118.     cin >> n >> k;
  119.     vector<vl> g(n + 1);
  120.     for (ll i = 2, p; i <= n; ++i) {
  121.         cin >> p;
  122.         g[p].push_back(i);
  123.     }
  124.     vl dcnt(n);
  125.     ll min_leaf = LLONG_MAX / 2;
  126.     auto dfs = [&](auto &&self, ll u, ll depth) -> void {
  127.         dcnt[depth] += 1;
  128.         bool is_leaf = true;
  129.         for (auto v : g[u]) {
  130.             self(self, v, depth + 1);
  131.             is_leaf = false;
  132.         }
  133.         if (is_leaf)
  134.             min_leaf = min(min_leaf, depth);
  135.     };
  136.     dfs(dfs, 1, 0);
  137.     ll ans = 0;
  138.  
  139.     vector<vl> dp(n - k + 1, vl(k + 1, LLONG_MIN / 2));
  140.     dp[0][0] = 0;
  141.     auto search = [&](auto &&self, ll sid, ll r1, ll r2) -> ll {
  142.         if (sid > min_leaf || dcnt[sid] == 0)
  143.             return 0;
  144.         if (r1 < dcnt[sid] && r2 < dcnt[sid])
  145.             return 0;
  146.         if (dp[r1][r2] != LLONG_MIN / 2)
  147.             return dp[r1][r2];
  148.         ll res = 0;
  149.         if (r1 >= dcnt[sid]) {
  150.             ll branch = self(self, sid + 1, r1 - dcnt[sid], r2) + 1;
  151.             res = max(res, branch);
  152.         }
  153.         if (r2 >= dcnt[sid]) {
  154.             ll branch = self(self, sid + 1, r1, r2 - dcnt[sid]) + 1;
  155.             res = max(res, branch);
  156.         }
  157.         ans = max(ans, res);
  158.         return dp[r1][r2] = res;
  159.     };
  160.  
  161.     search(search, 0, n - k, k);
  162.  
  163.     cout << ans << '\n';
  164. }
  165.  
  166. int main(int argc, char **argv)
  167. {
  168.     std::ios::sync_with_stdio(false);
  169.     std::cin.tie(nullptr);
  170.  
  171.     ll t = 1;
  172.     cin >> t;
  173.     while (t--)
  174.         solve3();
  175.  
  176.     return 0;
  177. };
  178.  
Advertisement
Add Comment
Please, Sign In to add comment