제출 #125125

#제출 시각아이디문제언어결과실행 시간메모리
125125NMAC427Islands (IOI08_islands)C++17
0 / 100
378 ms69228 KiB
// https://oj.uz/problem/view/IOI08_islands #include <bits/stdc++.h> #define ff first #define ss second using namespace std; using ll = long long int; int N; vector<pair<int, int>> to; vector<vector<int>> from; vector<bool> inCycle; pair<ll, ll> dfsSolve(int v) { ll max1 = 0; ll max2 = 0; ll 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.ff >= max1) { max2 = max1; max1 = childDFS.ff; } else if (childDFS.ff > max2) { max2 = childDFS.ff; } maxInternal = max(maxInternal, childDFS.ss); } 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); for (int i = 0; i < N; i++) { if (visited[i]) continue; vector<int> cycle; int next = i; while (true) { visited[next] = true; cycle.push_back(next); if (visited[to[next].ff]) { bool __inCycle = false; for (int v: cycle) { if (to[next].ff == v) __inCycle = true; if (__inCycle) inCycle[v] = true; } break; } else { next = to[next].ff; } } } from.clear(); visited.clear(); // Solve ll ans = 0; // for (int i = 0; i < N; i++) { // if (!inCycle[i]) continue; // ll compAns = 0; // vector<int> cycle; // vector<ll> dfsV; // vector<ll> prefixSum = {0}; // int next = i; // do { // auto dfs = dfsSolve(next); // compAns = max(compAns, dfs.ss); // Internal Path // cycle.push_back(next); // dfsV.push_back(dfs.ff); // prefixSum.push_back(prefixSum.back() + to[next].ss); // next = to[next].ff; // } while (next != i); // for (int v: cycle) { // inCycle[v] = false; // Don't visit same component twice // } // ll prefixFwd = dfsV[0]; // ll prefixBwd = dfsV[0]; // for(int i = 1; i < cycle.size(); i++) { // compAns = max(compAns, dfsV[i] + prefixSum[i] + prefixFwd); // compAns = max(compAns, dfsV[i] - prefixSum[i] + prefixBwd + prefixSum.back()); // prefixFwd = max(prefixFwd, dfsV[i] - prefixSum[i]); // prefixBwd = max(prefixBwd, dfsV[i] + prefixSum[i]); // } // 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...