WA 20pts,测了第二个点有负数```cpp #include<bits/stdc++.h> #define RG register #define IL inline #define int long long using namespace std; const int maxm = 200005; const int maxn = 100005; IL int Read(); IL void Rite(int x); int n,k,cnt(-1),head[maxm]; int d[maxn][22],f[maxn][22]; struct node{ int to,nxt; }edge[maxm]; void Input(int u,int v){ edge[++cnt] = {v,head[u]}; head[u] = cnt; } void DFS1(int u,int fa,int j){ d[u][j] = d[u][0]; for(int i = head[u];~i;i = edge[i].nxt){ int v = edge[i].to; if(v == fa) continue; DFS1(v,u,j); d[u][j] += d[v][j - 1]; } } void DFS2(int u,int fa,int j){ for(int i = head[u];~i;i = edge[i].nxt){ int v = edge[i].to; if(fa == v) continue; if(j == 1) f[v][1] += f[u][0]; else f[v][j] += f[u][j - 1] - f[v][j - 2]; DFS2(v,u,j); } } signed main(){ memset(head,-1,sizeof(head)); n = Read(); k = Read(); for(int i = 1;i < n;++i){ int u = Read(),v = Read(); Input(u,v); Input(v,u); } for(int i = 1;i <= n;++i) d[i][0] = Read(); for(int i = 1;i <= k;++i) DFS1(1,0,i); for(int i = 1;i <= n;++i) for(int j = 0;j <= k;++j) f[i][j] = d[i][j]; for(int i = 1;i <= k;++i) DFS2(1,0,i); for(int i = 1;i <= n;++i){ Rite(f[i][k]); putchar('\n'); } return 0; } IL int Read(){ char c(getchar()); int x(0),f(1); while(c < '0' || c > '9'){ if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9'){ x = x * 10 + c - '0'; c = getchar(); } return x * f; } IL void Rite(int x){ if(x < 0) putchar('-'),x = -x; if(x > 9) Rite(x / 10); putchar(x % 10 + '0'); }