Submission #503750

#TimeUsernameProblemLanguageResultExecution timeMemory
503750tabrIslands (IOI08_islands)C++17
80 / 100
501 ms131076 KiB
#include <bits/stdc++.h> using namespace std; #ifdef tabr #include "library/debug.cpp" #else #define debug(...) #endif int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<vector<int>> g(n); vector<int> l(n); vector<int> e(n); for (int i = 0; i < n; i++) { int j; cin >> j >> l[i]; j--; e[i] = j; g[i].emplace_back(i); g[j].emplace_back(i); } for (int i = 0; i < n; i++) { if (e[e[i]] == i) { l[e[i]] = l[i] = max(l[e[i]], l[i]); } } long long ans = 0; vector<int> was(n); vector<int> pv(n); vector<int> cycle(n); vector<int> cnt2(n); vector<long long> now2(n); for (int i = 0; i < n; i++) { if (was[i]) { continue; } int c1 = -1, c2 = -1; int sz = 0; int dead = -1; function<void(int, int)> dfs1 = [&](int v, int pe) { was[v] = 1; for (auto id : g[v]) { if (id == pe) { continue; } int to = v ^ id ^ e[id]; if (was[to]) { if (c1 != -1) { continue; } dead = id; c1 = v; c2 = to; debug(c1, c2); cycle[v]++; if (pv[to] != -1) { cycle[pv[to]]--; } continue; } pv[to] = v; dfs1(to, id); cycle[v] += cycle[to]; } sz += cycle[v]; }; pv[i] = -1; dfs1(i, -1); vector<long long> d1(sz + 1), d2(sz + 1); function<void(int, int)> dfs2 = [&](int v, int p) { cnt2[v] += cycle[v]; d1[cnt2[v]] = max(d1[cnt2[v]], now2[v]); for (auto id : g[v]) { int to = v ^ id ^ e[id]; if (to == p || id == dead) { continue; } cnt2[to] = cnt2[v]; now2[to] = now2[v] + l[id]; dfs2(to, v); } }; now2[c1] = cnt2[c1] = 0; dfs2(c1, c2); swap(d1, d2); now2[c2] = cnt2[c2] = 0; dfs2(c2, c1); swap(d1, d2); for (int j = 0; j < sz; j++) { d1[j + 1] = max(d1[j + 1], d1[j]); d2[j + 1] = max(d2[j + 1], d2[j]); } long long t = 0; function<long long(int, int)> dfs3 = [&](int v, int p) { vector<long long> c; for (auto id : g[v]) { int to = v ^ id ^ e[id]; if (to == p || id == dead) { continue; } now2[to] = now2[v] + l[id]; c.emplace_back(dfs3(to, v)); } t = max(t, now2[v]); if (c.empty()) { return now2[v]; } sort(c.rbegin(), c.rend()); if (c.size() > 1) { t = max(t, c[0] + c[1] - 2 * now2[v]); } return c[0]; }; now2[c1] = 0; dfs3(c1, c2); now2[c2] = 0; dfs3(c2, c1); debug(t); debug(d1); debug(d2); for (int j = 1; j < sz; j++) { t = max(t, d1[j] + d2[sz - j] + l[dead]); } ans += t; } cout << ans << '\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...