站外题求条!悬 3 关!
  • 板块学术版
  • 楼主jeffstart
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/5/8 22:43
  • 上次更新2024/5/9 13:51:56
查看原帖
站外题求条!悬 3 关!
482998
jeffstart楼主2024/5/8 22:43

我的代码:

#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 关!

2024/5/8 22:43
加载中...