제출 #39303

#제출 시각아이디문제언어결과실행 시간메모리
39303qoo2p5구슬과 끈 (APIO14_beads)C++14
100 / 100
399 ms25580 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; const int INF = (int) 1e9 + 1e6 + 123; const ll LINF = (ll) 1e18 + 1e9 + 123; const ld EPS = (ld) 1e-7; const ll MOD = (ll) 1e9 + 7; #define sz(x) (int) (x).size() #define mp(x, y) make_pair(x, y) #define pb push_back #define all(x) (x).begin(), (x).end() #define lb(s, t, x) (int) (lower_bound(s, t, x) - s) #define ub(s, t, x) (int) (upper_bound(s, t, x) - s) #define rep(i, f, t) for (int i = f; i < t; i++) #define per(i, f, t) for (int i = f; i >= t; i--) ll power(ll x, ll y, ll mod = MOD) { if (y == 0) { return 1; } if (y & 1) { return power(x, y - 1, mod) * x % mod; } else { ll tmp = power(x, y / 2, mod); return tmp * tmp % mod; } } template<typename A, typename B> bool mini(A &x, const B &y) { if (y < x) { x = y; return true; } return false; } template<typename A, typename B> bool maxi(A &x, const B &y) { if (y > x) { x = y; return true; } return false; } void add(ll &x, ll y) { x += y; if (x >= MOD) x -= MOD; if (x < 0) x += MOD; } ll mult(ll x, ll y) { return x * y % MOD; } void run(); #define TASK "" int main() { #ifdef LOCAL if (strlen(TASK) > 0) { cerr << "Reminder: you are using file i/o, filename: " TASK "!" << endl << endl; } #endif #ifndef LOCAL if (strlen(TASK)) { freopen(TASK ".in", "r", stdin); freopen(TASK ".out", "w", stdout); } ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #endif cout << fixed << setprecision(12); run(); return 0; } // == SOLUTION == // const int N = (int) 2e5 + 123; int n; vector<pair<int, int>> g[N]; int take[N], ntake[N]; ll ans; void dfs1(int v, int f = -1, int up_w = 0) { ntake[v] = 0; take[v] = 0; rep(i, 0, sz(g[v])) { int u = g[v][i].first; if (u == f) { continue; } dfs1(u, v, g[v][i].second); ntake[v] += take[u]; } if (f != -1) { for (auto &it : g[v]) { int u = it.first; if (u == f) { continue; } maxi(take[v], ntake[v] - take[u] + ntake[u] + it.second + up_w); } } maxi(take[v], ntake[v]); } void dfs2(int v, int f = -1, int up = 0, int prv_up = 0, int up_w = 0) { multiset<int> q; for (auto &it : g[v]) { int u = it.first; if (u == f) { continue; } q.insert(-take[u] + ntake[u] + it.second); } for (auto &it : g[v]) { int u = it.first; if (u == f) { continue; } q.erase(q.find(-take[u] + ntake[u] + it.second)); int nup = up + ntake[v] - take[u]; if (f != -1) { maxi(nup, ntake[v] - take[u] + prv_up + ntake[f] - take[v] + it.second + up_w); } if (sz(q)) maxi(nup, ntake[v] - take[u] + up + *q.rbegin() + it.second); dfs2(u, v, nup, up, it.second); q.insert(-take[u] + ntake[u] + it.second); } maxi(ans, ntake[v] + up); } void run() { cin >> n; rep(i, 1, n) { int u, v, c; cin >> u >> v >> c; g[u].pb({v, c}); g[v].pb({u, c}); } dfs1(1); ans = ntake[1]; dfs2(1); cout << ans << "\n"; }

컴파일 시 표준 에러 (stderr) 메시지

beads.cpp: In function 'int main()':
beads.cpp:72:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(TASK ".in", "r", stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
beads.cpp:73:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(TASK ".out", "w", stdout);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...