제출 #1367759

#제출 시각아이디문제언어결과실행 시간메모리
1367759maya_sCat in a tree (BOI17_catinatree)C++20
51 / 100
329 ms589824 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void dfs(ll node, ll k, vector<vector<ll>> &g, vector<vector<ll>> &dp){
    for(ll i: g[node]) dfs(i, k, g, dp);
    for(ll min_depth = k; min_depth > 0; min_depth--){
        dp[node][min_depth] = dp[node][min_depth+1];
        ll sum_far_enough = 0;
        for(ll i: g[node]) sum_far_enough += dp[i][max(min_depth - 1, k - min_depth - 1)];
        for(ll i: g[node]) dp[node][min_depth] = max(dp[node][min_depth], sum_far_enough - dp[i][max(min_depth - 1, k - min_depth - 1)] + dp[i][min_depth-1]);
    }
    dp[node][0] = dp[node][k]+1;
    for(ll min_depth = k; min_depth >= 0; min_depth--) dp[node][min_depth] = max(dp[node][min_depth], dp[node][min_depth+1]);
}

ll solve(ll n, ll k, vector<vector<ll>> &g){
    if(k >= n) return 0;
    vector<vector<ll>> dp(n, vector<ll>(k+2));
    dfs(0, k, g, dp);
    return dp[0][0];
}

int main(){
    ll n, k; cin >> n >> k;
    vector<vector<ll>> g(n);
    for(ll i = 1; i <= n-1; i++){
        ll p; cin >> p;
        g[p].push_back(i);
    }
    cout << solve(n, k, g);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…