제출 #125119

#제출 시각아이디문제언어결과실행 시간메모리
125119NMAC427Islands (IOI08_islands)C++17
90 / 100
1028 ms131072 KiB
// https://oj.uz/problem/view/IOI08_islands #include <bits/stdc++.h> #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.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; } } } // Solve int ans = 0; for (int i = 0; i < N; i++) { if (!inCycle[i]) continue; int compAns = 0; vector<int> cycle; vector<int> dfsV; vector<int> 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 } int prefixFwd = dfsV[0]; int 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; }

컴파일 시 표준 에러 (stderr) 메시지

islands.cpp: In function 'int main()':
islands.cpp:123:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 1; i < cycle.size(); i++) {
                  ~~^~~~~~~~~~~~~~
#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...