
我的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10, M = 20;
typedef long long ll;
ll dep[N], f[M][N], d[N];
ll d2[N], d1[N];
vector<int> G[N];
ll ans[N], sum[M][N];
void dfs1(int u, int fa) {
dep[u] = dep[fa] + 1;
f[0][u] = fa;
for (int i = 1; i < M; i++) {
f[i][u] = f[i - 1][f[i - 1][u]];
}
for (auto v : G[u]) {
if (v != fa) {
dfs1(v, u);
}
}
}
int lca(int a, int b) {
if (dep[a] > dep[b]) {
swap(a, b);
}
for (int i = 20; i >= 0; i--) {
if ((dep[b] - dep[a]) >> i & 1) {
b = f[i][b];
}
}
if (a == b) {
return a;
}
for (int i = 20; i >= 0; i--) {
if (f[i][a] != f[i][b]) {
a = f[i][a];
b = f[i][b];
}
}
return f[0][a];
}
void dfs2(int u, int fa) {
for (auto v : G[u]) {
if (v != fa) {
d2[v] += d2[u];
dfs2(v, u);
d1[u] += d1[v];
}
}
d[u] = d1[u] + d2[u];
}
void dfs3(int u, int fa) {
sum[0][u] = d[u];
for (int i = 1; i < M; i++) {
sum[i][u] = sum[i - 1][u] + sum[i - 1][f[i - 1][u]];
}
ans[u] = d[u];
for (auto v : G[u]) {
if (v != fa) {
dfs3(v, u);
ans[u] += ans[v];
}
}
}
ll lca2(int a, int b) {
if (a == b) {
return d[a];
}
if (dep[a] > dep[b]) {
swap(a, b);
}
ll ans = 0;
for (int i = 20; i >= 0; i--) {
if ((dep[b] - dep[a]) >> i & 1) {
b = f[i][b];
ans += sum[i][b];
}
}
if (a == b) {
return ans;
}
for (int i = 20; i >= 0; i--) {
if (f[i][a] != f[i][b]) {
ans += sum[i][a];
ans += sum[i][b];
a = f[i][a];
b = f[i][b];
}
}
ans += d[f[0][a]] + d[a] + d[b];
return ans;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, q1, q2, q3, q4;
cin >> n >> q1 >> q2 >> q3 >> q4;
for (int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1, 0);
while (q1--) {
int u, v, w;
cin >> u >> v >> w;
d1[u] += w, d1[v] += w;
int x = lca(u, v);
d1[x] -= w, d1[f[0][x]] -= w;
}
while (q2--) {
int u, w;
cin >> u >> w;
d2[u] += w;
}
dfs2(1, 0);
dfs3(1, 0);
while (q3--) {
int u, v;
cin >> u >> v;
cout << lca2(u, v) << "\n";
}
while (q4--) {
int x;
cin >> x;
cout << ans[x] << "\n";
}
return 0;
}
求条!悬 3 关!