萌新求助样例全过,提交全错

P3178 [HAOI2015] 树上操作

@[FiraCode](/user/528430) build函数有问题。 A了。 ```cpp #include <bits/stdc++.h> using namespace std; #define int long long using ll = long long; const int N = 100010; int n, m; int a[N]; vector<int> e[N]; int dfn[N], top[N], dep[N], fa[N], sz[N], son[N], idx; int na[N]; void dfs1(int u, int f) { dep[u] = dep[f] + 1; fa[u] = f; sz[u] = 1; for (auto v : e[u]) { if (v == f) continue; dfs1(v, u); sz[u] += sz[v]; if (!son[u] || sz[son[u]] < sz[v]) son[u] = v; } } void dfs2(int u, int topf) { dfn[u] = ++idx; na[idx]=a[u]; top[u] = topf; if (son[u]) dfs2(son[u], topf); for (auto v : e[u]) { if (v == son[u] || v == fa[u]) continue; dfs2(v, v); } } struct Node { int l, r; ll sum, add; }tr[N * 4]; void pushup(int u) { tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum; } void pushdown(int u) { tr[u << 1].add += tr[u].add; tr[u << 1 | 1].add += tr[u].add; tr[u << 1].sum += (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].add; tr[u << 1 | 1].sum += (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].add; tr[u].add = 0; } void build(int u, int l, int r) { tr[u] = {l, r}; if (l == r) { tr[u].sum = na[l]; return; } int mid = (l + r) >> 1; build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); pushup(u); } void modify(int u, int l, int r, int d) { if (tr[u].l >= l && tr[u].r <= r) { tr[u].add += d; tr[u].sum += (tr[u].r - tr[u].l + 1) * d; return; } pushdown(u); int mid = (tr[u].l + tr[u].r) >> 1; if (l <= mid) modify(u << 1, l, r, d); if (r > mid) modify(u << 1 | 1, l, r, d); pushup(u); } ll query(int u, int l, int r) { if (tr[u].l >= l && tr[u].r <= r) { return tr[u].sum; } pushdown(u); int mid = (tr[u].l + tr[u].r) >> 1; ll res = 0; if (l <= mid) res += query(u << 1, l, r); if (r > mid) res += query(u << 1 | 1, l, r); return res; } ll query(int u, int v) { ll ans = 0; while (top[u] != top[v]) { if (dep[top[u]] < dep[top[v]]) swap(u, v); ans += query(1, dfn[top[u]], dfn[u]); u = fa[top[u]]; } if (dep[u] > dep[v]) swap(u, v); ans += query(1, dfn[u], dfn[v]); return ans; } signed main() { scanf("%lld%lld", &n, &m); for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]); for (int i = 1; i < n; ++i) { int u, v; scanf("%lld%lld", &u, &v); e[u].push_back(v); e[v].push_back(u); } dfs1(1, 0); dfs2(1, 1); build(1, 1, n); while (m--) { int opt; scanf("%lld", &opt); if (opt == 1) { int x, d; scanf("%lld%lld", &x, &d); modify(1, dfn[x], dfn[x], d); }else if (opt == 2) { int x, d; scanf("%lld%lld", &x, &d); modify(1, dfn[x], dfn[x] + sz[x] - 1, d); }else { int x; scanf("%lld", &x); printf("%lld\n", query(1, x)); } } return 0; } ```
by XHY20180718 @ 2022-12-31 12:07:25


@[xiehuiying](/user/399475) 非常感谢。解决了我好几天的困惑。 ![](//图.tk/gg!25)![](//图.tk/gh!25)
by FiraCode @ 2022-12-31 12:26:42


|