洛咕
题意:给你一棵\(n\)个点的树,点带权,对于每个节点求出距离它不超过 \(k\)的所有节点权值和\(a_i\).
分析:"对于每个节点"即相当于要以每个节点为根算一次贡献,还是考虑换根\(DP\).设\(f[i][j]\)表示以\(i\)点为根的子树内与\(i\)距离不超过\(j\)的所有节点的点权和,则\(f[u][j]+=f[v][j-1],u->v\).
那么以\(1\)号点为根求出上述\(f\)数组后,\(ans[1]=f[1][k]\).那么对于\(u->v\),如何由\(ans[u]\)求出\(ans[v]\)呢?随便手玩一棵树发现转移的时候,需要知道\(g[i][k]\)表示以\(i\)点为中心,与\(i\)距离不超过\(k\)的所有点的点权和.这个可以在换根时通过\(f[i][j]\)得到.写到这里我突然发现我的\(ans\)数组是多余的啊,换根\(DP\)的时候我都已经把所有的\(g[i][j]\)都求出来了,最终答案不就是每个点的\(g[i][k]\)么?
#include
#include
#include
#include
#include
#include
#include