1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| #include <bits/stdc++.h> using namespace std; const int N=400010,M=10000010; int n,D,a[N],ans[N]; vector<int>v[N]; int sz[N],F[N],S,rt,st[N]; #define err cerr<<"Running on line: "<<__LINE__<<". " #define out cout<<"Running on line: "<<__LINE__<<". " void getrt(int x,int fa){ sz[x]=1; F[x]=0; for(int u:v[x]){ if(u==fa||st[u])continue; getrt(u,x); sz[x]+=sz[u]; F[x]=max(F[x],sz[u]); } F[x]=max(F[x],S-sz[x]); if(F[x]<F[rt])rt=x; } int dep[N]; int ls[M],rs[M],num[M],R[N],idx,md,c[N],ID; vector<int>V[N]; void copy(int x,int y){ls[x]=ls[y],rs[x]=rs[y],num[x]=num[y];} int build(int p,int l,int r){ p=++idx; if(l==r)return p; int mid=(l+r)>>1; ls[p]=build(p,l,mid); rs[p]=build(p,mid+1,r); return p; } int insert(int p,int l,int r,int x,int y){ ++idx,copy(idx,p),p=idx; if(l==r){ num[p]+=y; return p; } int mid=(l+r)>>1; if(mid>=x)ls[p]=insert(ls[p],l,mid,x,y); else rs[p]=insert(rs[p],mid+1,r,x,y); num[p]=num[ls[p]]+num[rs[p]]; return p; } int query(int p,int l,int r,int ql,int qr){ if(ql<=l&&r<=qr)return num[p]; int mid=(l+r)>>1,res=0; if(mid>=ql)res+=query(ls[p],l,mid,ql,qr); if(mid<qr)res+=query(rs[p],mid+1,r,ql,qr); return res; } int rnk(int x,int y){return x<0?0:query(R[min(md+1,x+1)],0,n,0,y);} void dfs(int x,int fa,int dis,int minn){ minn=min(minn,a[x]-dis); dep[x]=dis; md=max(md,dep[x]); c[dep[x]]++; V[dep[x]].push_back(minn); for(int u:v[x]){ if(u==fa||st[u])continue; dfs(u,x,dis+1,minn); } } void dfs2(int x,int fa,int minn){ minn=min(minn,a[x]+dep[x]); if(minn<=dep[x])ans[x]+=dep[x]>D?0:c[min(md,D-dep[x])]; else ans[x]+=rnk(D-dep[x],dep[x]); for(int u:v[x]){ if(u==fa||st[u])continue; dfs2(u,x,minn); } } void dfs3(int x,int fa,int minn){ minn=min(minn,a[x]-dep[x]); md=max(md,dep[x]); c[dep[x]]++; V[dep[x]].push_back(minn); for(int u:v[x]){ if(u==fa||st[u])continue; dfs3(u,x,minn); } } void dfs4(int x,int fa,int minn){ minn=min(minn,a[x]+dep[x]); if(minn<=dep[x])ans[x]-=dep[x]>D?0:c[min(md,D-dep[x])]; else ans[x]-=rnk(D-dep[x],dep[x]); for(int u:v[x]){ if(u==fa||st[u])continue; dfs4(u,x,minn); } } void solve(int x){ st[x]=1; md=0; dfs(x,0,0,n+1); for(int i=0;i<=md;i++){ R[i+1]=R[i]; for(int u:V[i]) R[i+1]=insert(R[i+1],0,n,max(u,0),1); } for(int i=1;i<=md;i++)c[i]+=c[i-1]; for(int u:v[x]){ if(st[u])continue; dfs2(u,x,a[x]+dep[x]); } ans[x]+=rnk(D,0); for(int i=0;i<=md;i++)c[i]=0; for(int i=ID+1;i<=idx;i++) ls[i]=rs[i]=num[i]=0; for(int i=0;i<=md;i++)V[i].clear(); idx=ID; for(int u:v[x]){ if(st[u])continue; md=0; dfs3(u,x,a[x]-dep[x]); for(int i=0;i<=md;i++){ R[i+1]=R[i]; for(int u:V[i]) R[i+1]=insert(R[i+1],0,n,max(u,0),1); } for(int i=1;i<=md;i++)c[i]+=c[i-1]; dfs4(u,x,a[x]+dep[x]); for(int i=0;i<=md;i++)c[i]=0; for(int i=ID+1;i<=idx;i++) ls[i]=rs[i]=num[i]=0; for(int i=0;i<=md;i++)V[i].clear(); idx=ID; } for(int u:v[x]){ if(st[u])continue; S=sz[u],rt=0; getrt(u,0),getrt(rt,0); solve(rt); } } int main(){ F[0]=1e9; scanf("%d%d",&n,&D); for(int i=1;i<=n;i++)scanf("%d",a+i); for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } R[0]=build(1,0,n); ID=idx; S=n,rt=0; getrt(1,0),getrt(rt,0); solve(rt); for(int i=1;i<=n;i++)printf("%d\n",ans[i]); return 0; }
|