Submission #109680

#TimeUsernameProblemLanguageResultExecution timeMemory
109680popovicirobertElection Campaign (JOI15_election_campaign)C++14
100 / 100
402 ms35408 KiB
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long
// 217
// 44

using namespace std;

struct Fenwick {
    vector <ll> aib;
    int n;

    inline void init(int _n) {
        n = _n;
        aib.resize(n + 1);
    }

    inline void update(int pos, int val) {
        for(int i = pos; i <= n; i += lsb(i)) {
            aib[i] += val;
        }
    }

    inline ll query(int pos) {
        ll ans = 0;
        for(int i = pos; i > 0; i -= lsb(i)) {
            ans += aib[i];
        }
        return ans;
    }

    inline ll sum(int l, int r) {
        return query(r) - query(l);
    }
};

const int MAXN = (int) 1e5;
const int LOG = 17;

vector <int> g[MAXN + 1];
int anc[MAXN + 1][LOG + 1], lvl[MAXN + 1];
int first[MAXN + 1], last[MAXN + 1], sz;


void dfs(int nod, int par) {

    first[nod] = ++sz;
    anc[nod][0] = par;
    for(int bit = 1; bit <= LOG; bit++) {
        anc[nod][bit] = anc[anc[nod][bit - 1]][bit - 1];
    }

    lvl[nod] = lvl[par] + 1;
    for(auto it : g[nod]) {
        if(it != par) {
            dfs(it, nod);
        }
    }

    last[nod] = ++sz;
}

inline int get_lca(int x, int y) {
    if(lvl[x] > lvl[y]) {
        swap(x, y);
    }

    for(int bit = 0; bit <= LOG; bit++) {
        if((lvl[y] - lvl[x]) & (1 << bit)) {
            y = anc[y][bit];
        }
    }

    if(x == y) {
        return x;
    }

    for(int bit = LOG; bit >= 0; bit--) {
        if(anc[x][bit] != anc[y][bit]) {
            x = anc[x][bit];
            y = anc[y][bit];
        }
    }

    return anc[x][0];
}

inline int get_anc(int nod, int len) {
    for(int bit = 0; bit <= LOG; bit++) {
        if(len & (1 << bit)) {
            nod = anc[nod][bit];
        }
    }

    return nod;
}

inline ll get_sum(int x, int y, Fenwick &fen) {
    x = first[x], y = first[y];

    if(x > y) {
        swap(x, y);
    }

    return fen.sum(x, y);

}

struct Query {
    int a, b, c;
};

vector <Query> qry[MAXN + 1];

Fenwick fen_dp, fen_sum;
ll dp[MAXN + 1], sum[MAXN + 1];


void solve(int nod, int par) {

    for(auto it : g[nod]) {
        if(it != par) {
            solve(it, nod);
            sum[nod] += dp[it];
        }
    }

    fen_sum.update(first[nod], sum[nod]);
    fen_sum.update(last[nod], -sum[nod]);

    dp[nod] = sum[nod];

    for(auto it : qry[nod]) {
        int a = it.a, b = it.b, c = it.c;
        ll cur = get_sum(a, nod, fen_sum) + get_sum(b, nod, fen_sum) - get_sum(a, nod, fen_dp) - get_sum(b, nod, fen_dp);
        dp[nod] = max(dp[nod], cur + sum[nod] + c);
    }

    fen_dp.update(first[nod], dp[nod]);
    fen_dp.update(last[nod], -dp[nod]);

}

int main() {
    //ifstream cin("A.in");
    //ofstream cout("A.out");
    int i, n, m;
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;

    for(i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    dfs(1, 0);

    cin >> m;

    for(i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        qry[get_lca(a, b)].push_back({a, b, c});
    }

    fen_dp.init(2 * n), fen_sum.init(2 * n);
    solve(1, 0);

    cout << dp[1];

    //cin.close();
    //cout.close();
    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...