Submission #125088

#TimeUsernameProblemLanguageResultExecution timeMemory
125088NMAC427Islands (IOI08_islands)C++17
0 / 100
776 ms131076 KiB
// https://oj.uz/problem/view/IOI08_islands #include <bits/stdc++.h> #define coutV(v) for (auto &e: v) {cerr << e << " ";} cerr << "\n" #define int int64_t #define ff first #define ss second using namespace std; int N; vector<pair<int, int>> to; vector<vector<int>> from; vector<bool> inCycle; pair<int, int> dfsSolve(int v) { int max1 = 0; int max2 = 0; int maxInternal = 0; // Maximum internal path; for (const int child: from[v]) { if (inCycle[child]) continue; // Check here because we want to be able to pass in a node of the cycle auto childDFS = dfsSolve(child); childDFS.ff += to[child].ss; if (childDFS.ss >= max1) { max2 = max1; max1 = childDFS.ff; } else if (childDFS.ss > max2) { max2 = childDFS.ff; } maxInternal = max(maxInternal, childDFS.ff); } maxInternal = max(maxInternal, max1 + max2); return {max1, maxInternal}; } signed main() { #ifndef __APPLE__ ios_base::sync_with_stdio(0); cin.tie(0); #endif cin >> N; to.resize(N); from.resize(N); for (int i = 0; i < N; i++) { cin >> to[i].ff >> to[i].ss; to[i].ff -= 1; from[to[i].ff].push_back(i); } // Generate inCycle Vector inCycle.assign(N, false); vector<bool> visited (N, false); vector<int> __cycle; for (int i = 0; i < N; i++) { if (visited[i]) continue; __cycle.clear(); queue<int> q; q.push(i); while (!q.empty()) { auto front = q.front(); q.pop(); __cycle.push_back(front); if (visited[front]) { bool __inCycle = false; for (auto v: __cycle) { if (to[i].ff == v) __inCycle = true; if (__inCycle) inCycle[v] = true; } continue; } visited[front] = true; q.push(to[front].ff); } } // Solve int ans = 0; for (int i = 0; i < N; i++) { if (!inCycle[i]) continue; int compAns = 0; int next = i; vector<int> cycle; vector<int> dfsV; do { auto dfs = dfsSolve(next); compAns = max(compAns, dfs.ss); // Internal Path cycle.push_back(next); dfsV.push_back(dfs.ff); next = to[next].ff; } while (next != i); for (int v: cycle) { inCycle[v] = false; // Don't visit same component twice } coutV(cycle); int leftPtr = 0; int rightPtr = 1; int diameter = cycle.size(); int prefix = dfsV[0] + to[i].ss; while (leftPtr < diameter && leftPtr != (rightPtr % diameter)) { compAns = max(compAns, prefix + dfsV[rightPtr]); if (prefix <= dfsV[rightPtr]) { prefix = dfsV[rightPtr]; } prefix += to[cycle[rightPtr]].ss; rightPtr = (rightPtr + 1) % diameter; } cerr << "CompAns = " << compAns << "\n"; cerr << "-----------------\n"; ans += compAns; } 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...