Submission #1129845

#TimeUsernameProblemLanguageResultExecution timeMemory
1129845vladiliusCat in a tree (BOI17_catinatree)C++20
11 / 100
1 ms836 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define pb push_back #define ff first #define ss second #define arr4 array<int, 4> const int infm = -1e9; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, d; cin>>n>>d; vector<int> g[n + 1]; for (int i = 2; i <= n; i++){ int p; cin>>p; p++; g[p].pb(i); } const int S = 500; if (d <= S){ vector<vector<int>> dp(n + 1, vector<int>(d)); function<void(int)> dfs = [&](int v){ for (int i: g[v]){ dfs(i); } dp[v][0] = 1; for (int i: g[v]) dp[v][0] += dp[i][d - 1]; for (int x = 1; x < d; x++){ int sum = 0; for (int i: g[v]){ sum += dp[i][max(x - 1, d - x - 1)]; } for (int i: g[v]){ dp[v][x] = max(dp[v][x], (sum - dp[i][max(x - 1, d - x - 1)]) + dp[i][x - 1]); } } for (int i = d - 2; i >= 0; i--){ dp[v][i] = max(dp[v][i], dp[v][i + 1]); } }; dfs(1); cout<<dp[1][0]<<"\n"; return 0; } int k = ceil(1.0 * n / d) + 1; vector<vector<int>> dp(n + 1, vector<int>(k, infm)); vector<int> f(n + 1); function<void(int)> dfs = [&](int v){ for (int i: g[v]){ dfs(i); } vector<arr4> all; for (int i: g[v]){ for (int j = 0; j < k; j++){ if (dp[i][j] == infm) continue; int x = dp[i][j], y = max(x, d - x - 2); all.pb({x, i, 0, j}); all.pb({y, -i, x, j}); } } auto cmp = [&](arr4 x, arr4 y){ if (x[0] != y[0]) return x[0] > y[0]; return x[1] > y[1]; }; sort(all.begin(), all.end(), cmp); int sum = 0; for (auto [x, y, t, vv]: all){ if (y > 0){ sum -= f[y]; f[y] = vv; sum += f[y]; } else { y = -y; int val = vv + sum - f[y]; dp[v][val] = max(dp[v][val], t + 1); } } for (int i = k - 2; i >= 0; i--){ dp[v][i] = max(dp[v][i], dp[v][i + 1]); } dp[v][1] = max(dp[v][1], 0); dp[v][0] = d; for (int i: g[v]) f[i] = 0; }; dfs(1); for (int i = k - 1; i >= 0; i--){ if (dp[1][i] != infm){ cout<<i<<"\n"; return 0; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...