제출 #312174

#제출 시각아이디문제언어결과실행 시간메모리
312174AkashiIslands (IOI08_islands)C++14
80 / 100
1236 ms131076 KiB
#include <bits/stdc++.h> using namespace std; #define x first #define y second const int DIM = 1e6 + 1; int n; long long ans; bool viz[DIM]; int tt[DIM], ct[DIM]; long long s[DIM], dp[DIM], sp[DIM], mx[DIM]; vector <pair <int, int>> v[DIM]; int nr; pair <int, int> cyc[DIM]; 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[++nr] = {now, ct[now]}; else cyc[++nr] = {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] + dp[it.x] + 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 ; nr = 0; ans = 0; find_cycle(i); long long sum = 0; for (int i = 1; i <= nr ; ++i) { int nod = cyc[i].x; sp[nod] = sum; for (auto it : v[nod]) { if (!onCyc[it.x]) { dfs(it.x); ans = max(ans, mx[nod] + dp[it.x] + it.y); mx[nod] = max(mx[nod], dp[it.x] + it.y); } } s[nod] = mx[nod] + sp[nod]; sum = sum + cyc[i].y; ans = max(ans, mx[nod]); } for (int i = nr - 1; i >= 1 ; --i) { int nod = cyc[i].x; ans = max(ans, mx[nod] - sp[nod] + s[cyc[i + 1].x]); s[nod] = max(s[nod], s[cyc[i + 1].x]); } for (int i = 1; i <= nr ; ++i) { int nod = cyc[i].x; s[nod] = mx[nod] + sum - sp[nod]; } for (int i = nr - 1; i >= 1 ; --i) { int nod = cyc[i].x; ans = max(ans, mx[nod] + sp[nod] + s[cyc[i + 1].x]); s[nod] = max(s[nod], s[cyc[i + 1].x]); } sol += ans; } printf("%lld\n", sol); return 0; }

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

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