Cod sursa(job #2940392)

Utilizator divadddDavid Curca divaddd Data 15 noiembrie 2022 14:25:01
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 100002
#define LMAX 20
using namespace std;
vector<int> v[NMAX];
int n,x,y,dp[NMAX][LMAX],vf[NMAX],k[NMAX],rad;
/// dp[i][j] = al 2^j-lea stramos al nodului i

ifstream fin("cerere.in");
ofstream fout("cerere.out");

void dfs(int nod){
    for(auto vecin: v[nod]){
        dp[vecin][0] = nod;
        for(int j = 1; j < LMAX; j++){
            dp[vecin][j] = dp[dp[vecin][j-1]][j-1];
        }
        dfs(vecin);
    }
}

int getstramos(int nod, int m){
    /// al m-lea stramos al lui nod
    for(int j = LMAX-1; j >= 0; j--){
        if(m&(1<<j)){ /// are bit-ul j setat
            nod = dp[nod][j];
        }
    }
    return nod;
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> k[i];
    }
    for(int i = 1; i < n; i++){
        fin >> x >> y;
        v[x].push_back(y);
        vf[y] = x; /// refolosesc vf
    }
    for(int i = 1; i <= n; i++){
        if(vf[i] == 0){
            rad = i;
            break;
        }
    }
    memset(vf,0,sizeof(vf));
    dfs(rad);
    for(int i = 1; i <= n; i++){
        int cnt = 0;
        int nod = i;
        while(k[nod] != 0){
            cnt++;
            nod = getstramos(nod, k[nod]);
        }
        fout << cnt << " ";
    }
    return 0;
}