Submission #1129865

#TimeUsernameProblemLanguageResultExecution timeMemory
1129865vladiliusCat in a tree (BOI17_catinatree)C++20
0 / 100
0 ms320 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
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);
    }
    
    int k = ceil(1.0 * n / d);
    vector<vector<int>> dp(n + 1, vector<int>(k + 1, infm));
    function<void(int)> dfs = [&](int v){
        for (int i: g[v]){
            dfs(i);
        }
        
        int sm = 1;
        for (int i: g[v]){
            for (int j = k; j >= 0; j--){
                if (dp[i][j] >= (d - 1)){
                    sm += j;
                    break;
                }
            }
            for (int j = 0; j <= k; j++){
                if (dp[i][j] == infm) continue;
                int x = dp[i][j], y = max(x, d - x - 2), sum = j;
                for (int t: g[v]){
                    if (t == i) continue;
                    for (int p = k; p >= 0; p--){
                        if (dp[t][p] >= y){
                            sum += p;
                            break;
                        }
                    }
                }
                dp[v][sum] = max(dp[v][sum], x + 1);
            }
        }
        dp[v][sm] = max(dp[v][sm], 0);
        dp[v][0] = 1e9;
    };
    dfs(1);
    
    for (int j = k; j >= 0; j--){
        if (dp[1][j] != infm){
            cout<<j<<"\n";
            return 0;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...