Submission #510215

#TimeUsernameProblemLanguageResultExecution timeMemory
510215BERNARB01Islands (IOI08_islands)C++17
15 / 100
2057 ms131076 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<vector<pair<int, int>>> g(n); for (int i = 0; i < n; i++) { int to, w; cin >> to >> w; --to; g[i].emplace_back(to, w); g[to].emplace_back(i, w); } vector<int> vis(n, 0); vector<int> nm; function<void(int)> mark_comp_vis = [&](int v) { vis[v] = 1; nm.push_back(v); for (auto [u, w] : g[v]) { if (vis[u]) { continue; } mark_comp_vis(u); } }; vector<int> cyc; vector<int> stk; function<bool(int, int)> get_cyc = [&](int v, int pr) { stk.push_back(v); vis[v] = 1; int ccc = 0; for (auto [u, w] : g[v]) { ccc += (u == pr); } if (ccc == (int) g[v].size()) { while (!stk.empty()) { cyc.push_back(stk.back()); if (stk.back() == pr) { break; } stk.pop_back(); } return true; } for (auto [u, w] : g[v]) { if (u == pr) { continue; } if (vis[u]) { while (!stk.empty()) { cyc.push_back(stk.back()); if (stk.back() == u) { break; } stk.pop_back(); } return true; } if (get_cyc(u, v)) { return true; } } stk.pop_back(); return false; }; vector<long long> d(n); function<void(int, int)> calc_dists = [&](int v, int pr) { d[v] = 0; for (auto [u, w] : g[v]) { if (u == pr || vis[u]) { continue; } d[v] = max(d[v], w + d[u]); calc_dists(u, v); } }; long long res = 0; for (int i = 0; i < n; i++) { if (!vis[i]) { nm.clear(); mark_comp_vis(i); for (int v : nm) { vis[v] = 0; } cyc.clear(); stk.clear(); get_cyc(i, -1); for (int v : nm) { vis[v] = 0; } for (int v : cyc) { vis[v] = 1; } long long ans = 0; for (int v : cyc) { calc_dists(v, -1); } long long cyclen = 0; for (int v : cyc) { for (auto [u, w] : g[v]) { if (vis[u]) { cyclen += w; } } } cyclen >>= 1; for (int v : cyc) { for (auto [u, w] : g[v]) { if (vis[u]) { ans = max(ans, d[v] + cyclen - w); } } } for (int k = 1; k < (int) cyc.size(); k++) { int v = cyc[k]; long long dvu = 0; for (int j = k - 1; j >= 0; j--) { for (auto [u, w] : g[v]) { if (u == cyc[j]) { dvu += w; break; } } ans = max(ans, d[v] + d[cyc[j]] + max(dvu, cyclen - dvu)); } } res += ans; for (int v : nm) { vis[v] = 1; } } } cout << res << '\n'; 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...
#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...