제출 #1264520

#제출 시각아이디문제언어결과실행 시간메모리
1264520namhhElection Campaign (JOI15_election_campaign)C++20
100 / 100
143 ms29912 KiB
#include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fi first #define se second const int N = 1e5+1; const int lg = 17; int n,m,t[N][lg],h[N],dp[N][2],sta[N],pos[N],ed[N],bits[N],timer = 1; struct query{ int u,v,c; }; query qr[N]; vector<query>aqua[N]; vector<int>adj[N]; void update(int u, int val){ while(u <= n){ bits[u] += val; u += u & (-u); } } int query(int u){ int sum = 0; while(u > 0){ sum += bits[u]; u -= u & (-u); } return sum; } void dfs(int u, int p){ h[u] = h[p]+1; t[u][0] = p; for(int i = 1; i <= 16; i++) t[u][i] = t[t[u][i-1]][i-1]; for(int v : adj[u]){ if(v == p) continue; dfs(v,u); } } void dfs1(int u, int p){ sta[u] = timer; pos[timer] = u; timer++; for(int v: adj[u]){ if(v != p) dfs1(v,u); } ed[u] = timer-1; } int lca(int u, int v){ if(h[u] < h[v]) swap(u,v); for(int i = 16; i >= 0; i--) if(h[t[u][i]] >= h[v]) u = t[u][i]; if(u == v) return u; for(int i = 16; i >= 0; i--) if(t[u][i] != t[v][i]){ u = t[u][i]; v = t[v][i]; } return t[u][0]; } int jump(int v, int u){ for(int i = 16; i >= 0; i--){ if(h[t[v][i]] > h[u]) v = t[v][i]; } return v; } void dfsdp(int u, int p){ int sum = 0; for(int v: adj[u]){ if(v != p){ dfsdp(v,u); sum += max(dp[v][0],dp[v][1]); } } dp[u][0] = sum; if(!aqua[u].empty()){ int mmb = -1e9; for(auto v: aqua[u]){ int aqua = v.c; if(v.u != u){ int t = jump(v.u,u); aqua += query(sta[v.u])-query(sta[t])+dp[t][0]-max(dp[t][0],dp[t][1]); } if(v.v != u){ int t = jump(v.v,u); aqua += query(sta[v.v])-query(sta[t])+dp[t][0]-max(dp[t][0],dp[t][1]); } mmb = max(mmb,aqua); } dp[u][1] = sum+mmb; update(sta[u],dp[u][0]-max(dp[u][0],dp[u][1])); update(ed[u]+1,max(dp[u][0],dp[u][1])-dp[u][0]); } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; for(int i = 1; i < n; i++){ int u,v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } dfs(1,0); dfs1(1,0); cin >> m; for(int i = 1; i <= m; i++){ cin >> qr[i].u >> qr[i].v >> qr[i].c; int k = lca(qr[i].u,qr[i].v); aqua[k].push_back(qr[i]); } dfsdp(1,0); // for(int i = 1; i <= n; i++){ // for(int j = 0; j <= 1; j++) cout << i << " " << j << " " << dp[i][j] << "\n"; // } cout << max(dp[1][0],dp[1][1]); }
#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...