Cod sursa(job #2719754)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 10 martie 2021 11:43:34
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arborest.in");
ofstream g("arborest.out");

int tata[100100],ck[100100];
vector <int> v[100100];
struct arborest
{
    int h,nd;
}a[100100];

void dfs(int nod)
{
    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        if(a[vecin].h==-1)
        {
            a[vecin].h=a[nod].h+1;
            dfs(vecin);
        }
    }
}

int compare(arborest A, arborest B)
{
    return (A.h>B.h);
}

void check(int nod)
{
    ck[nod]=1;

    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        if(vecin!=tata[nod])check(vecin);
    }
}

int n,k,K,cpmij,p,u,mij,i,x,nr,cnt,nod,ans,dp[100100][20];
int main()
{
    f>>n>>k;
    for(i=2;i<=n;i++)
    {
        f>>x;
        tata[i]=x;
        v[x].push_back(i);

        dp[i][0]=x;
    }

    for(K=1;(1<<K)<=n;K++)
    for(i=1;i<=n;i++)
        dp[i][K]=dp[dp[i][K-1]][K-1];

    p=1;u=n;
    while(p<=u)
    {
        mij=(p+u)/2;

        cnt=0;
        for(i=1;i<=n;i++)a[i].h=-1,a[i].nd=i,ck[i]=0;
        a[1].h=0;
        dfs(1);

        sort(a+1,a+n+1,compare);

        for(i=1;i<=n;i++)
        {
            if(a[i].h>mij && ck[a[i].nd]==0)
            {
                 nod=a[i].nd;cpmij=mij-1;nr=0;
                 while(cpmij)
                 {
                     if(cpmij%2==1)nod=dp[nod][nr];
                     nr++;
                     cpmij/=2;
                 }

                 check(nod);
                 cnt++;
            }
        }

        if(cnt<=k)ans=mij,u=mij-1;
        else p=mij+1;
    }

    g<<ans;
    return 0;
}