Submission #503756

#TimeUsernameProblemLanguageResultExecution timeMemory
503756tabrIslands (IOI08_islands)C++17
0 / 100
448 ms98200 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> last_id(n); for (int i = 0; i < n; i++) { if (was[i]) { continue; } int c1 = -1, c2 = -1; int sz = 0; int dead = -1; pv[i] = -1; { // dfs1 stack<pair<int, int>> stk; stk.emplace(i, -1); while (!stk.empty()) { auto [v, pe] = stk.top(); if (last_id[v] == (int) g[v].size()) { for (auto id : g[v]) { int to = v ^ id ^ e[id]; if (to == pv[v]) { continue; } cycle[v] += cycle[to]; } sz += cycle[v]; stk.pop(); continue; } for (int gid = last_id[v]; gid < (int) g[v].size(); gid++) { int id = g[v][gid]; last_id[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; stk.emplace(to, id); break; } } } vector<long long> d1(sz + 1), d2(sz + 1); 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); 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...