1. 程式人生 > >P3066 [USACO12DEC]逃跑的BarnRunning Away From… 樹上差分_樹上倍增

P3066 [USACO12DEC]逃跑的BarnRunning Away From… 樹上差分_樹上倍增

code:

#include <cstdio>
using namespace std;
#define ll long long 
const int N=200005;
int n,fa[N][23],re[N];
ll d[N],up;
int main()
{
    //freopen("input.in","r",stdin);
    int i,j,tmp; 
    scanf("%d%lld",&n,&up); 
    re[1]=1,fa[1][0]=0;
    for(i=2;i<=n;++i)
    {
        scanf("%d%lld",&fa[i][0],&d[i]), d[i]=d[i]+d[fa[i][0]];
        for(j=1;j<=19;j++)fa[i][j]=fa[fa[i][j-1]][j-1];
        tmp=i; 
        for(j=19;j>=0;--j)
            if(d[i]-d[fa[tmp][j]]<=up)tmp=fa[tmp][j]; 
        --re[fa[tmp][0]], ++re[i];
    }
    for(i=n;i>=2;i--)re[fa[i][0]]+=re[i]; 
    for(i=1;i<=n;i++)printf("%d\n",re[i]);
    return 0;
}