Submission #503747

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