Submission #1172476

#TimeUsernameProblemLanguageResultExecution timeMemory
1172476ElayV13Cat in a tree (BOI17_catinatree)C++20
0 / 100
2 ms5184 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ld long double
#define FOR(a , b) for(int i = a;i <= b;i++)
#define pb push_back

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MXN = 2e5 + 5;
const int INF = 1e18;
const int LOG = 20;

int n , d , dep[MXN] , up[LOG][MXN];
vector < int > adj[MXN];

void dfs(int v , int p)
{
        up[0][v] = p;
        for(int i = 1;i < LOG;i++) up[i][v] = up[i - 1][up[i - 1][v]];
        for(int u : adj[v])
        {
                if(u != p) dep[u] = dep[v] + 1 , dfs(u , v);
        }
}

int LCA(int a , int b)
{
        if(dep[a] < dep[b]) swap(a , b);
        int dif = dep[a] - dep[b];
        for(int i = 0;i < LOG;i++)
        {
                if((1 << i) & dif)
                {
                        a = up[i][a];
                }
        }
        if(a == b) return a;
        for(int i = LOG - 1;i >= 0;i--)
        {
                if(up[i][a] != up[i][b])
                {
                        a = up[i][a];
                        b = up[i][b];
                }
        }
        return up[0][a];
}

int get(int u , int v)
{
        int anc = LCA(u , v);
        return (dep[u] - dep[anc]) + (dep[v] - dep[anc]);
}

vector < int > marked;

void dfs2(int v , int p)
{
        bool can = 1;
        for(int u : marked)
        {
                int dd = get(u , v);
                if(dd < d) can = 0;
        }
        if(can) marked.push_back(v);
        for(int u : adj[v]){
                if(u == p) continue;
                dfs2(u , v);
        }
}

void solve()
{
        cin >> n >> d;
        for(int i = 2;i <= n;i++)
        {
                int u;
                cin >> u;
                ++u;
                adj[i].push_back(u);
                adj[u].push_back(i);
        }
        dfs(1 , -1);
        int res = -INF;
        for(int i = 1;i <= n;i++)
        {
                marked.clear();
                dfs2(i , -1);
                res = max(res , (int)marked.size());
        }
        cout << res << endl;
}

signed main(){
      ios_base::sync_with_stdio(0);cin.tie(0);
      int T = 1;
      //cin >> T;
      FOR(1 , T) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...