Submission #1156811

#TimeUsernameProblemLanguageResultExecution timeMemory
1156811Hamed_GhaffariElection Campaign (JOI15_election_campaign)C++20
100 / 100
106 ms26440 KiB
#include<bits/stdc++.h>
using namespace std;

#define mid ((l+r)>>1)
#define maxs(a,b) (a=max(a,b))
#define pb push_back

const int MXN = 1e5+5;
const int LOG = 17;

int n, m, A[MXN], B[MXN], C[MXN];
vector<int> g[MXN];
int par[LOG][MXN], stt[MXN], fnt[MXN], timer;

void dfs(int v) {
    stt[v] = timer++;
    for(int i=1; i<LOG; i++)
        par[i][v] = par[i-1][par[i-1][v]];
    for(int u : g[v])
        if(u^par[0][v])
            par[0][u] = v,
            dfs(u);
    fnt[v] = timer;
}
inline bool is_anc(int u, int v) { return stt[u]<=stt[v] && fnt[v]<=fnt[u]; }
inline int LCA(int u, int v) {
    if(is_anc(u,v)) return u;
    for(int i=LOG-1; i>=0; i--)
        if(par[i][u] && !is_anc(par[i][u], v))
            u = par[i][u];
    return par[0][u];
}

int fen[MXN];
inline void updx(int s, int e, int x) {
    for(++s; s<MXN; s+=s&-s) fen[s] += x;
    for(++e; e<MXN; e+=e&-e) fen[e] -= x;
}
inline int getx(int p) {
    int res=0;
    for(++p; p; p-=p&-p) res += fen[p];
    return res;
}

vector<int> Q[MXN];
int dp[MXN];

void DFS(int v) {
    int sum=0;
    for(int u : g[v])
        if(u^par[0][v])
            DFS(u),
            sum += dp[u];
    dp[v] = sum;
    for(int i : Q[v])
        maxs(dp[v], getx(stt[A[i]])+getx(stt[B[i]])+C[i]+sum);
    updx(stt[v], fnt[v], sum-dp[v]);
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n;
    for(int i=0, u,v; i<n-1; i++) {
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
    dfs(1);
    int m;
    cin >> m;
    for(int i=1; i<=m; i++) {
        cin >> A[i] >> B[i] >> C[i];
        Q[LCA(A[i], B[i])].pb(i);
    }
    DFS(1);
    cout << dp[1] << '\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...