Submission #1225573

#TimeUsernameProblemLanguageResultExecution timeMemory
1225573minhpkElection Campaign (JOI15_election_campaign)C++20
100 / 100
134 ms100760 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

int a;
vector<int> z[1000005];
int logarit[1000005];
int sta[1000005], fin[1000005], high[1000005];
int euler[2000005], st[2000005][21]; // cần gấp đôi kích thước euler
int tour;

struct node {
    int x, y, val;
};
node q[1000005];
vector<int> pos[1000005];

void dfs(int u, int par) {
    sta[u] = ++tour;
    euler[tour] = u;

    for (int v : z[u]) {
        if (v == par) continue;
        high[v] = high[u] + 1;
        dfs(v, u);
        euler[++tour] = u;
    }

    fin[u] = tour;
}

void build_log() {
    logarit[1] = 0;
    for (int i = 2; i <= 2 * a; i++) {
        logarit[i] = logarit[i / 2] + 1;
    }
}

void build_st() {
    for (int i = 1; i <= tour; i++) {
        st[i][0] = euler[i];
    }

    for (int j = 1; (1 << j) <= tour; j++) {
        for (int i = 1; i + (1 << j) - 1 <= tour; i++) {
            int u = st[i][j - 1];
            int v = st[i + (1 << (j - 1))][j - 1];
            st[i][j] = (high[u] < high[v] ? u : v);
        }
    }
}

int lca(int u, int v) {
    int l = sta[u], r = sta[v];
    if (l > r) swap(l, r);
    int j = logarit[r - l + 1];
    int u1 = st[l][j];
    int u2 = st[r - (1 << j) + 1][j];
    return (high[u1] < high[u2]) ? u1 : u2;
}


int bit[1000005];
void update(int i, int val) {
    i++;
    while (i <= tour) {
        bit[i] += val;
        i += i & -i;
    }
}

int query(int i) {
    i++;
    int res = 0;
    while (i > 0) {
        res += bit[i];
        i -= i & -i;
    }
    return res;
}

int dfs1(int u, int par) {
    int sum = 0;
    for (int v : z[u]) {
        if (v == par) continue;
        sum += dfs1(v, u);
    }

    int best = 0;
    for (int id : pos[u]) {
        auto [x, y, val] = q[id];
        int pre = val + query(sta[x]) + query(sta[y]);
        best = max(best, pre);
    }

    update(sta[u], -best);
    update(fin[u] + 1, best);

    return sum + best;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a;
    for (int i = 1; i < a; i++) {
        int u, v;
        cin >> u >> v;
        z[u].push_back(v);
        z[v].push_back(u);
    }

    dfs(1, 0);
    build_log();
    build_st();

    int c;
    cin >> c;
    for (int i = 1; i <= c; i++) {
        int x, y, val;
        cin >> x >> y >> val;
        int l = lca(x, y);
        pos[l].push_back(i);
        q[i] = {x, y, val};
    }

    cout << dfs1(1, 0) << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...