Submission #990419

#TimeUsernameProblemLanguageResultExecution timeMemory
990419huutuanIslands (IOI08_islands)C++14
100 / 100
432 ms103764 KiB
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int n, vis[N], _vis[N], par[N], wpar[N], on_cycle[N]; vector<pair<int, int>> g[N]; long long pf[N], f[N][2]; int cycle[N]; int stk[N], LL, RR; void dfs(int _u){ LL=0; RR=0; stk[RR++]=_u; while (RR-LL){ int u=stk[RR-1]; if (vis[u]){ --RR; long long mx1=-1e18, mx2=-1e18; for (auto &e:g[u]){ int v=e.first, w=e.second; if (on_cycle[v]) continue; long long val=f[v][0]+w; f[u][0]=max(f[u][0], val); f[u][1]=max(f[u][1], f[v][1]); if (mx1<val) mx2=mx1, mx1=val; else mx2=max(mx2, val); } f[u][1]=max({f[u][1], f[u][0], mx1+mx2}); continue; } vis[u]=1; for (auto &e:g[u]){ int v=e.first; if (on_cycle[v]) continue; stk[RR++]=v; } } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for (int i=1; i<=n; ++i){ int j, k; cin >> j >> k; g[j].emplace_back(i, k); par[i]=j; wpar[i]=k; } long long ans=0; for (int i=1; i<=n; ++i) if (!vis[i]){ int L=0, R=0; long long cur=0; int u=i; while (1){ if (_vis[u]) break; _vis[u]=1; cycle[R++]=u; u=par[u]; } L=find(cycle+L, cycle+R, u)-cycle; for (int j=L; j<R; ++j) on_cycle[cycle[j]]=1; for (int j=L; j<R; ++j){ dfs(cycle[j]); cur=max(cur, f[cycle[j]][1]); } pf[L]=0; for (int j=L; j<R; ++j){ pf[j+1]=pf[j]+wpar[cycle[j]]; } long long sum=pf[R]; long long mx1=-1e18, mx2=-1e18; for (int j=L; j<R; ++j){ cur=max(cur, f[cycle[j]][0]+pf[j]+mx1); cur=max(cur, f[cycle[j]][0]-pf[j]+mx2); mx1=max(mx1, f[cycle[j]][0]-pf[j]); mx2=max(mx2, f[cycle[j]][0]+sum+pf[j]); } ans+=cur; } 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...