1 条题解

  • 0
    @ 2023-11-2 18:29:05
    #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
    上传者