Advertisement
tien_noob

DP on tree - 1065F Codeforces

Oct 27th, 2021
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. //Make CSP great again
  2. //You're as beautiful as the day I lost you
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. using namespace std;
  6. const int N = 1e6;
  7. vector<int> Adj[N + 1];
  8. int n, depth[N + 1], k, dp[N + 1][3];
  9. void read()
  10. {
  11.     cin >> n >> k;
  12.     for (int i = 2; i <= n; ++ i)
  13.     {
  14.         int p;
  15.         cin >> p;
  16.         Adj[p].push_back(i);
  17.     }
  18. }
  19. void DFS(int u)
  20. {
  21.     if (Adj[u].empty())
  22.     {
  23.         dp[u][0] = depth[u] - k;
  24.         dp[u][1] = dp[u][2] = 1;
  25.         return ;
  26.     }
  27.     dp[u][0] = N + 10;
  28.     dp[u][1] = dp[u][2] = 0;
  29.     for (int v : Adj[u])
  30.     {
  31.         depth[v] = depth[u] + 1;
  32.         DFS(v);
  33.         if (dp[v][0] <= depth[u])
  34.         {
  35.             dp[u][0] = min(dp[u][0], dp[v][0]);
  36.             dp[u][1] += dp[v][1];
  37.         }
  38.     }
  39.     for (int v : Adj[u])
  40.     {
  41.         if (dp[v][0] <= depth[u])
  42.         {
  43.             dp[u][2] = max(dp[u][2], dp[v][2] + dp[u][1] - dp[v][1]);
  44.         }
  45.         else
  46.         {
  47.             dp[u][2] = max(dp[u][2], dp[u][1] + dp[v][2]);
  48.         }
  49.     }
  50. }
  51. void solve()
  52. {
  53.     DFS(1);
  54.     /*for (int i = 1; i <= n; ++ i)
  55.     {
  56.         cerr << dp[i][1] << ' ';
  57.     }
  58.     cerr << '\n';*/
  59.     cout << dp[1][2];
  60. }
  61. int main()
  62. {
  63.     ios_base::sync_with_stdio(false);
  64.     cin.tie(nullptr);
  65.     if (fopen(TASK".INP", "r"))
  66.     {
  67.         freopen(TASK".INP", "r", stdin);
  68.         //freopen(TASK".OUT", "w", stdout);
  69.     }
  70.     int t = 1;
  71.     bool typetest = false;
  72.     if (typetest)
  73.     {
  74.         cin >> t;
  75.     }
  76.     for (int __ = 1; __ <= t; ++ __)
  77.     {
  78.         //cout << "Case " << __ << ": ";
  79.         read();
  80.         solve();
  81.     }
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement