Submission #734423

#TimeUsernameProblemLanguageResultExecution timeMemory
734423Alihan_8Beads and wires (APIO14_beads)C++17
100 / 100
358 ms51016 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define pb push_back #define ln '\n' #define int long long template <class _T> bool chmin(_T &x, const _T &y){ bool flag = false; if ( x > y ){ x = y; flag |= true; } return flag; } template <class _T> bool chmax(_T &x, const _T &y){ bool flag = false; if ( x < y ){ x = y; flag |= true; } return flag; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector <pair<int,int>> g[n]; for ( int i = 1; i < n; i++ ){ int x, y, w; cin >> x >> y >> w; g[--x].pb({--y, w}); g[y].pb({x, w}); } const int inf = 1e18 + 1; vector <array<int,2>> dp(n); multiset <int> s[n]; vector <int> par_w(n); function <void(int,int,int)> dfs = [&](int x, int par, int prev){ int cnt = 0; par_w[x] = prev; for ( auto [to, w]: g[x] ){ if ( to == par ) continue; dfs(to, x, w); cnt += dp[to][1]; s[x].insert(dp[to][0] - dp[to][1] + w); } dp[x][0] = cnt; if ( !s[x].empty() ){ dp[x][1] = cnt + *s[x].rbegin() + par_w[x]; } chmax(dp[x][1], dp[x][0]); }; int res = 0; function <void(int,int)> reRoot = [&](int x, int par){ chmax(res, dp[x][0]); auto erase = [&](int x, int val){ s[x].erase(s[x].find(val)); }; for ( auto [to, w]: g[x] ){ if ( to == par ) continue; par_w[x] = w; par_w[to] = 0; erase(x, -dp[to][1] + dp[to][0] + w); dp[x][0] -= dp[to][1]; dp[x][1] = dp[x][0]; if ( !s[x].empty() ){ chmax(dp[x][1], dp[x][0] + *s[x].rbegin() + par_w[x]); } s[to].insert(dp[x][0] + w - dp[x][1]); dp[to][0] += dp[x][1]; dp[to][1] = max(dp[to][0], dp[to][0] + *s[to].rbegin() + par_w[to]); reRoot(to, x); swap(x, to); par_w[x] = w; par_w[to] = 0; erase(x, -dp[to][1] + dp[to][0] + w); dp[x][0] -= dp[to][1]; dp[x][1] = dp[x][0]; if ( !s[x].empty() ){ chmax(dp[x][1], dp[x][0] + *s[x].rbegin() + par_w[x]); } s[to].insert(dp[x][0] + w - dp[x][1]); dp[to][0] += dp[x][1]; dp[to][1] = max(dp[to][0], dp[to][0] + *s[to].rbegin() + par_w[to]); swap(x, to); } }; dfs(0, -1, 0); reRoot(0, -1); cout << res; cout << '\n'; } /* 10 4 10 2 1 2 21 1 3 13 6 7 1 7 9 5 2 4 3 2 5 8 1 6 55 6 8 34 */

Compilation message (stderr)

beads.cpp: In function 'int main()':
beads.cpp:39:15: warning: unused variable 'inf' [-Wunused-variable]
   39 |     const int inf = 1e18 + 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...