Submission #231018

#TimeUsernameProblemLanguageResultExecution timeMemory
231018lycBeads and wires (APIO14_beads)C++14
100 / 100
227 ms27760 KiB
#include <bits/stdc++.h> using namespace std; #define TRACE(x) cerr << #x << " :: " << x << endl #define _ << " " << #define SZ(x) (int)(x).size() #define ALL(x) (x).begin(),(x).end() #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define RFOR(i,a,b) for (int i=(a);i>=(b);--i) using ii=pair<int,int>; using ll=long long; const int MX_N = 2e5+5; const int INF = 2e9+10; int N; vector<ii> al[MX_N]; ll f[MX_N][3], g[MX_N][2], ans = 0; void DFS(int u, int p) { ll best[] = {-INF,-INF}; for (ii v : al[u]) if (v.first != p) { DFS(v.first,u); ll val = max(f[v.first][0], f[v.first][1]+v.second); f[u][0] += val; ll x = f[v.first][0]+v.second - val; FOR(i,0,1) if (x > best[i]) swap(x,best[i]); } if (best[0] == -INF) f[u][1] = -INF; else f[u][1] = f[u][0] + best[0]; if (f[u][1] == -INF || best[1] == -INF) f[u][2] = -INF; else f[u][2] = f[u][1] + best[1]; ans = max(ans, f[u][0]); } void DFS2(int u, int p) { ll sum = 0; ll best[] = {-INF,-INF}; ll bestV[] = {-1,-1}; for (ii v : al[u]) if (v.first != p) { ll val = max(f[v.first][0], f[v.first][1]+v.second); sum += val; ll x = f[v.first][0]+v.second - val; ll y = v.first; FOR(i,0,1) if (x > best[i]) swap(x,best[i]), swap(y,bestV[i]); } for (ii v : al[u]) if (v.first != p) { ll val = max(f[v.first][0], f[v.first][1]+v.second); g[v.first][0] = max({ g[u][0] + (sum-val), v.second + g[u][1] + (sum-val), v.second + g[u][0] + (sum-val) + (bestV[0] == v.first ? best[1] : best[0]) }); g[v.first][1] = v.second + g[u][0] + (sum-val), DFS2(v.first,u); } ans = max(ans, f[u][0] + g[u][0]); if (f[u][1] != -INF) ans = max(ans, f[u][1] + g[u][1]); if (f[u][2] != -INF) ans = max(ans, f[u][2] + g[u][0]); //TRACE(u _ g[u][0] _ g[u][1]); //TRACE(u _ f[u][0] _ f[u][1] _ f[u][2] _ g[u][0] _ g[u][1]); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> N; FOR(i,1,N-1){ int A, B, C; cin >> A >> B >> C; al[A].emplace_back(B,C); al[B].emplace_back(A,C); } DFS(1,0); g[1][1] = -INF; DFS2(1,0); cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...