Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> ii;
- #define fr first
- #define sc second
- #define mp make_pair
- #define pb push_back
- const int MAXN = 100010;
- const int MAXK = 21;
- int n, k;
- ll dp[MAXN][MAXK];
- ll sum[MAXN][MAXK];
- int p[MAXN];
- vector<int> adj[MAXN];
- int ar[MAXN];
- void pre(int u, int par = -1)
- {
- p[u] = par;
- for (int i = 0; i < adj[u].size(); i++) if (adj[u][i] - par)
- pre(adj[u][i], u);
- }
- void dfs(int u)
- {
- dp[u][0] = ar[u];
- for (int i = 0; i < adj[u].size(); i++) if (adj[u][i] - p[u])
- {
- int v = adj[u][i];
- dfs(v);
- for (int j = 1; j <= k; j++)
- dp[u][j] += dp[v][j - 1];
- }
- }
- int main()
- {
- scanf("%d%d", &n, &k);
- for (int i = 0; i < n - 1; i++)
- {
- int u, v;
- scanf("%d%d", &u, &v);
- adj[u].pb(v);
- adj[v].pb(u);
- }
- for (int i = 1; i <= n; i++)
- scanf("%d", &ar[i]);
- pre(1);
- dfs(1);
- for (int i = 1; i <= n; i++)
- {
- sum[i][0] = dp[i][0];
- for (int j = 1; j <= k; j++)
- sum[i][j] = sum[i][j - 1] + dp[i][j];
- }
- for (int u = 1; u <= n; u++)
- {
- ll ans = 0;
- int rem = k;
- int v = u;
- int prevv = -1;
- while (v != -1 && rem >= 0)
- {
- ans += sum[v][rem];
- if (prevv != -1 && rem)
- ans -= sum[prevv][rem - 1];
- prevv = v;
- v = p[v];
- rem--;
- }
- printf("%I64d\n", ans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement