P3066 [USACO12DEC]逃跑的BarnRunning Away From… 樹上差分_樹上倍增
阿新 • • 發佈:2018-12-11
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; }