Codeforces Round #381 (Div. 1), problem: (B) Alyona and a tree Solution in C/C++

Hi guys , I just solved the second problem of round 381 , Hope you like it , feel free to comment any better solution .

 

#include<stdio.h>
#include<stdlib.h>
typedef long long unsigned llu;
typedef unsigned u;
u P[19][222222],S[222222],R[222222],A[222222];
u *G[222222],Ga[222222],Gi[222222];
llu W[19][222222];
void add(u i,u j)
{
if(Ga[i]==Gi[i])
{
if(!Ga[i])G[i]=(u*)calloc(Ga[i]=1,sizeof(u));
else G[i]=(u*)realloc(G[i],(Ga[i]<<=1)*sizeof(u));
}
G[i][Gi[i]++]=j;
return;
}
u F(u n)
{
u i,j=0;
for(i=Gi[n];i–;)j+=F(G[n][i]);
return R[n]=j+1-S[n];
}
int main()
{
u n,i=0,j,k,l;
for(scanf(“%u”,&n);++i<=n;)scanf(“%u”,A+i);
for(k=1;++k<=n;)
{
scanf(“%u%u”,&i,&j);
add(i,k);
W[0][k]=j;
P[0][k]=i;
}
W[0][1]=0;
P[0][1]=1;
for(i=0;++i<19;)for(j=0;++j<=n;)
{
P[i][j]=P[i-1][P[i-1][j]];
W[i][j]=W[i-1][j]+W[i-1][P[i-1][j]];
}
for(i=0;++i<=n;)
{
k=A[l=i];
while(l!=1&&W[0][l]<=k)
{
for(j=19;W[–j][l]>k;);
k-=W[j][l];l=P[j][l];
}
++S[l>1?P[0][l]:0];
}
F(1);
for(i=0;++i<=n;)printf(“%u “,R[i]-1);
return 0;
}

 

(Visited 229 times, 1 visits today)

About the Author:

Leave A Comment