1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; int n, m, a[maxn], d[maxn], fa[maxn][19], dep[maxn]; vector<int> g[maxn]; void dfs(int u, int p) { fa[u][0] = p; dep[u] = dep[p] + 1; for (auto v : g[u]) if (v != p) dfs(v, u); } int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); for (int i = 18; i >= 0; i--) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i]; if (u == v) return u; for (int i = 18; i >= 0; i--) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i]; return fa[u][0]; } void dfs2(int u, int p) { for (auto v : g[u]) if (v != p) dfs2(v, u), d[u] += d[v]; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", a+i); for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } dfs(1, 0); for (int i = 1; i <= 18; i++) for (int u = 1; u <= n; u++) fa[u][i] = fa[fa[u][i-1]][i-1]; scanf("%d", &m); while (m--) { int x, y, z; scanf("%d%d%d", &x, &y, &z); int p = lca(x, y), q = fa[p][0]; d[x] += z; d[y] += z; d[p] -= z; d[q] -= z; } dfs2(1, -1); for (int i = 1; i <= n; i++) printf("%d ", a[i] + d[i]); return 0; }
- 1
信息
- ID
- 21
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 10
- 已通过
- 4
- 上传者