Submission #958030

#TimeUsernameProblemLanguageResultExecution timeMemory
958030starchanElection Campaign (JOI15_election_campaign)C++17
100 / 100
128 ms29448 KiB
#include<bits/stdc++.h> using namespace std; #define in pair<int, int> #define inn pair<int, in> #define f first #define s second #define pb push_back #define pob pop_back #define INF (int)1e17 #define fast() ios_base::sync_with_stdio(false); cin.tie(NULL) const int MX = 1e5+5, LOGM = 18; vector<int> adj[MX]; vector<inn> st[MX]; int tin[MX], tout[MX], pa[LOGM][MX], dp[MX]; int timer; void dfs(int u, int p) { tin[u] = ++timer; pa[0][u] = p; for(int v: adj[u]) { if(v==p) continue; dfs(v, u); } tout[u] = timer; return; } inn lca(int u, int v) { if(tin[u] >= tin[v]) swap(u, v); if(tout[u] >= tout[v]) return {u, {u, v}}; for(int i = LOGM-1; i >= 0; i--) { int k = pa[i][u]; if(tout[k] >= tout[v]) continue; u = k; } int w = pa[0][u]; for(int i = LOGM-1; i >= 0; i--) { int k = pa[i][v]; if(tout[k] >= tout[w]) continue; } return {w, {u, v}}; } int fen[MX]; void add(int x, int val) { for(; x < MX; x+=(x&-x)) fen[x]+=val; return; } int Q(int u) { int ret = 0; for(int x = tin[u]; x; x-=(x&-x)) ret+=fen[x]; return ret; } void upd(int val, int u) { add(tin[u], val); add(tout[u]+1, -val); return; } void DFS(int u, int p) { int SUM = 0; for(int v: adj[u]) { if(v == p) continue; DFS(v, u); SUM+=dp[v]; } for(auto [C, ab]: st[u]) dp[u] = max(dp[u], C+Q(ab.f)+Q(ab.s)); dp[u]+=SUM; upd(SUM-dp[u], u); return; } signed main() { fast(); int n; cin >> n; int m = n-1; while(m--) { int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } pa[0][0] = 0; tin[0] = -1; tout[0] = INF; dfs(1, 0); for(int j = 1; j < LOGM; j++) { for(int i = 0; i <= n; i++) pa[j][i] = pa[j-1][pa[j-1][i]]; } int q; cin >> q; while(q--) { int l, r, w; cin >> l >> r >> w; auto [x, y] = lca(l, r); st[x].pb({w, {l, r}}); } DFS(1, 0); 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...