Submission #927444

#TimeUsernameProblemLanguageResultExecution timeMemory
927444AlphaMale06Election Campaign (JOI15_election_campaign)C++17
100 / 100
141 ms27476 KiB
#include <bits/stdc++.h>

using namespace std;

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

#define pb push_back
#define F first
#define S second

const int N = 1e5+3;
vector<int> adj[N];
int tin[N], tout[N], h[N];
vector<path> pth[N];
int p[N][18];
int timer=1;
int dp[N][2];
int f[2*N];

void dfs(int v, int par){
    h[v]=h[par]+1;
    tin[v]=timer++;
    p[v][0]=par;
    for(int i=1; i<18; i++){
        p[v][i]=p[p[v][i-1]][i-1];
    }
    for(int to : adj[v]){
        if(to!=par){
            dfs(to, v);
        }
    }
    tout[v]=timer++;
}

bool anc(int a, int b){
    if(tin[a]<=tin[b] && tout[a]>=tout[b])return 1;
    return 0;
}

int lca(int a, int b){
    if(anc(a, b))return a;
    if(anc(b, a))return b;
    for(int i=17; i>=0; i--){
        if(!anc(p[a][i], b)){
            a=p[a][i];
        }
    }
    return p[a][0];
}

void Update(int ind, int add){
    for(int i=ind; i<2*N; i+=i&-i)f[i]+=add;
}

int Get(int ind){
    int ret=0;
    for(int i = ind; i>0; i-=i&-i)ret+=f[i];
    return ret;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> n;
    for(int i=0; i< n-1; i++){
        int a, b;
        cin >> a >> b;
        adj[a].pb(b);
        adj[b].pb(a);
    }
    dfs(1, 1);
    cin >> m;
    for(int i=0; i< m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        pth[lca(a, b)].pb({a, b, c});
    }
    pair<int, int> order[n];
    for(int i=0; i< n; i++){
        order[i]={h[i+1], i+1};
    }
    sort(order, order+n);
    reverse(order, order+n);
    for(int i=0; i< n; i++){
        int node=order[i].S;
        for(int to : adj[node]){
            if(to!=p[node][0]){
                dp[node][0]+=dp[to][1];
            }
        }
        dp[node][1]=dp[node][0];
        for(path pt : pth[node]){
            dp[node][1]=max(dp[node][1], dp[node][0]+Get(tin[pt.a])+Get(tin[pt.b])-2*Get(tin[node])+pt.c);
        }
        Update(tin[node], dp[node][0]-dp[node][1]);
        Update(tout[node], dp[node][1]-dp[node][0]);
    }
    cout << dp[1][1] << '\n';
}
#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...