1 条题解

  • 0
    @ 2025-3-19 19:55:01

    2025/3/19

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6 + 5;
    
    int n, m, R, dfn[maxn], idx, id[maxn], val[maxn], sz[maxn];
    vector<int> g[maxn];
    
    void dfs(int u, int p) {
    	dfn[u] = ++idx;
    	id[idx] = u;
    	sz[u] = 1;
    	for (auto v : g[u])
    		if (v != p)
    			dfs(v, u), sz[u] += sz[v];
    }
    
    long long tr[maxn<<2], lazy[maxn<<2];
    void push_up(int u) {
    	tr[u] = tr[u<<1] + tr[u<<1|1];
    }
    void push_down(int l, int r, int u) {
    	if (lazy[u]) {
    		int mid = (l + r) / 2;
    		// [l, mid] mid-l+1
    		tr[u<<1] += lazy[u] * (mid - l + 1);
    		lazy[u<<1] += lazy[u];
    		// [mid+1, r] r-mid
    		tr[u<<1|1] += lazy[u] * (r - mid);
    		lazy[u<<1|1] += lazy[u];
    		lazy[u] = 0;
    	}
    }
    void build(int l, int r, int u) {
    	if (l == r) {
    		tr[u] = val[id[l]];
    		return;
    	}
    	int mid = (l + r) / 2;
    	build(l, mid, u<<1);
    	build(mid+1, r, u<<1|1);
    	push_up(u);
    }
    void add(int L, int R, long long x, int l, int r, int u) {
    	if (L <= l && r <= R) {
    		tr[u] += x * (r - l + 1);
    		lazy[u] += x;
    		return;
    	}
    	push_down(l, r, u);
    	int mid = (l + r) / 2;
    	if (L <= mid) add(L, R, x, l, mid, u<<1);
    	if (R > mid) add(L, R, x, mid+1, r, u<<1|1);
    	push_up(u);
    }
    long long query(int L, int R, int l, int r, int u) {
    	if (L <= l && r <= R)
    		return tr[u];
    	push_down(l, r, u);
    	long long res = 0;
    	int mid = (l + r) / 2;
    	if (L <= mid) res += query(L, R, l, mid, u<<1);
    	if (R > mid) res += query(L, R, mid+1, r, u<<1|1);
    	return res;
    }
    
    int main() {
    	scanf("%d%d%d", &n, &m, &R);
    	for (int i = 1; i <= n; i++)
    		scanf("%d", val+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(R, -1);
    	build(1, n, 1);
    	while (m--) {
    		int op, a, x;
    		scanf("%d%d", &op, &a);
    		if (op == 1) {
    			scanf("%d", &x);
    			add(dfn[a], dfn[a] + sz[a] - 1, x, 1, n, 1);
    		}
    		else {
    			printf("%lld\n", query(dfn[a], dfn[a] + sz[a] - 1, 1, n, 1));
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    37
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    13
    已通过
    4
    上传者