Submission #967580

#TimeUsernameProblemLanguageResultExecution timeMemory
967580AlperenT_Election Campaign (JOI15_election_campaign)C++14
100 / 100
179 ms83956 KiB
#include <bits/stdc++.h>

#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
#define F first
#define S second 
#define ld long double
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define PII pair<pii , pii>
#define sz(v) (int)v.size()
#define rep(i , a , b) for(int i=a;i <= (b);i++)
#define per(i , a , b) for(int i=a;i >= (b);i--)
#define deb(x) cout <<#x << " : " << x << "\n" ;
using namespace std ;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 1e6+10 + 10,  inf = 1e9+10 , lg = 19 , mod = 1000696969 ;
int fen[maxn][2] , sm[maxn] , dp[maxn] , par[maxn][lg+1] , n ,st[maxn] , en[maxn] , c= 1 , dis[maxn] ;
vector <int> G[maxn] ;
vector <pair<pii,int> > Q[maxn];
int up(int v ,int d){
    rep(i , 0 ,lg){
        if(d>>i&1) v = par[v][i] ;
    }
    return v ;
}
int lca(int v ,int u){
    if(dis[v] < dis[u])swap(v, u);
    v = up(v ,dis[v]-dis[u]);
    per(i , lg, 0){
        if(par[v][i] != par[u][i]){
            v = par[v][i] ;
            u = par[u][i] ;
        }
    }
    if(v==u)return v ;
    return par[v][0] ;
}
void upd(int x, int w , int t){
    while(x <= n){
        fen[x][t] += w ;
        x += x&-x ;
    }
}
int que(int x , int t){
    int ans = 0;
    while(x){
        ans = (fen[x][t] +ans);
        x -= x&-x ;
    }
    return ans ;
}
void bui(int v , int p =0){
    par[v][0] = p ;
    rep(i ,1 ,lg){
        par[v][i] = par[par[v][i-1]][i-1] ;
    }
    st[v] = c; c++;
    for(int u : G[v]){
        if(u == p)continue ;
        dis[u] = dis[v]+1;
        bui(u,v);
    }
    en[v] = c-1 ;
}
void dfs(int v ,int p =0){
    for(int u : G[v]){
        if(u == p)continue ;
        dfs(u , v);
        sm[v] += dp[u] ;
    }
    dp[v] = sm[v]; 
    for(auto x :Q[v]){
        int a= x.F.F , b = x.F.S , w = x.S ;
        int ans = que(st[a] , 0) + que(st[b] , 0) - que(st[a] , 1) - que(st[b] ,1) + sm[v] + w;
        dp[v] = max(dp[v] , ans) ;  
    }
    upd(st[v] , sm[v] , 0) ;upd(en[v]+1, -sm[v], 0) ;
    upd(st[v] , dp[v] , 1);upd(en[v]+1 ,-dp[v] , 1);
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
    cin >> n ;
    rep(i , 1, n-1){
        int v, u ;
        cin >> v >> u ;
        G[v].pb(u);
        G[u].pb(v);
    }
    bui(1);
    int q;
    cin >> q ;
    while(q--){
        int v, u , w ;
        cin >> v >> u >> w ;
        Q[lca(v,u)].pb({{v,u},w});
    }
    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...