제출 #916296

#제출 시각아이디문제언어결과실행 시간메모리
916296Alcabel구슬과 끈 (APIO14_beads)C++17
100 / 100
154 ms26308 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5; const long long inf = 1e13; vector<pair<int, int>> g[maxn]; long long dp[maxn][2]; void dfsCalc(int v, int p) { dp[v][0] = 0, dp[v][1] = -inf; for (const auto& [u, w] : g[v]) { if (u != p) { dfsCalc(u, v); dp[v][0] += max(dp[u][0], dp[u][1] + w); } } for (const auto& [u, w] : g[v]) { if (u != p) { dp[v][1] = max(dp[v][1], dp[v][0] - max(dp[u][0], dp[u][1] + w) + dp[u][0] + w); } } } long long up[maxn][2]; long long dfsAns(int v, int p, int pw) { long long ans, whole; ans = whole = dp[v][0] + max(up[v][0], up[v][1] + pw); pair<long long, int> max1 = {-inf, -2}, max2 = {-inf, -2}, cur; if (p != -1) { cur = {-max(up[v][0], up[v][1] + pw) + up[v][0] + pw, -1}; if (cur >= max1) { max2 = max1, max1 = cur; } else if (cur > max2) { max2 = cur; } } for (const auto& [u, w] : g[v]) { if (u != p) { cur = {-max(dp[u][0], dp[u][1] + w) + dp[u][0] + w, u}; if (cur >= max1) { max2 = max1, max1 = cur; } else if (cur > max2) { max2 = cur; } } } for (const auto& [u, w] : g[v]) { if (u != p) { up[u][0] = whole - max(dp[u][0], dp[u][1] + w); if (max1.second != u) { up[u][1] = up[u][0] + max1.first; } else { up[u][1] = up[u][0] + max2.first; } ans = max(ans, dfsAns(u, v, w)); } } return ans; } void solve() { int n; cin >> n; for (int i = 0; i < n - 1; ++i) { int v, u, w; cin >> v >> u >> w; --v, --u; g[v].emplace_back(u, w); g[u].emplace_back(v, w); } dfsCalc(0, -1); up[0][0] = up[0][1] = 0; cout << dfsAns(0, -1, 0) << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); int T = 1; cin >> T; while (T--) { solve(); cerr << "-----------\n"; cout << "-----------\n"; } #else int T = 1; // cin >> T; while (T--) { solve(); } #endif 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...