Submission #312161

#TimeUsernameProblemLanguageResultExecution timeMemory
312161AkashiIslands (IOI08_islands)C++14
54 / 100
666 ms131076 KiB
#include <bits/stdc++.h> using namespace std; #define x first #define y second const int DIM = 1e6 + 5; int n; long long ans; bool viz[DIM]; int tt[DIM], ct[DIM]; long long dp[DIM], sp[DIM], mx[DIM]; vector <pair <int, int>> v[DIM]; vector <pair <int, int>> cyc; bool onCyc[DIM]; bool find_cycle(int nod) { viz[nod] = true; bool found = false; bool foundPapa = false; for (auto it : v[nod]) { if (it.x == tt[nod] && !foundPapa) { foundPapa = true; continue ; } if (!found && viz[it.x]) { int now = nod; while (now != tt[it.x]) { if (now != it.x) cyc.push_back({now, ct[now]}); else cyc.push_back({now, it.y}); onCyc[now] = true; now = tt[now]; } found = true; continue ; } if (viz[it.x]) continue ; ct[it.x] = it.y; tt[it.x] = nod; bool ok = find_cycle(it.x); found |= ok; } return found; } void dfs(int nod, int papa = 0) { for (auto it : v[nod]) { if (onCyc[it.x] || it.x == papa) continue ; dfs(it.x, nod); ans = max(ans, dp[nod] + it.y); dp[nod] = max(dp[nod], dp[it.x] + it.y); } } int main() { scanf("%d", &n); int x, y; for (int i = 1; i <= n ; ++i) { scanf("%d%d", &x, &y); v[i].push_back({x, y}); v[x].push_back({i, y}); } long long sol = 0; for (int i = 1; i <= n ; ++i) { if (viz[i]) continue ; cyc.clear(); ans = 0; find_cycle(i); set <pair <long long, int>> s1; set <pair <long long, int>> s2; long long sum = 0; for (auto elem : cyc) { int nod = elem.x; sp[nod] = sum; for (auto it : v[nod]) { if (!onCyc[it.x]) { dfs(it.x); mx[nod] = max(mx[nod], dp[it.x] + it.y); } } s1.insert({mx[nod] + sp[nod], nod}); sum = sum + elem.y; ans = max(ans, mx[nod]); } for (auto elem : cyc) { int nod = elem.x; s2.insert({mx[nod] + sum - sp[nod], nod}); } for (auto elem : cyc) { int nod = elem.x; s1.erase({mx[nod] + sp[nod], nod}); s2.erase({mx[nod] + sum - sp[nod], nod}); if (s1.empty()) break ; ans = max(ans, mx[nod] - sp[nod] + s1.rbegin()->x); ans = max(ans, mx[nod] + sp[nod] + s2.rbegin()->x); } sol += ans; } printf("%lld\n", sol); return 0; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:64:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   64 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
islands.cpp:67:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   67 |   scanf("%d%d", &x, &y);
      |   ~~~~~^~~~~~~~~~~~~~~~
#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...