Submission #875624

#TimeUsernameProblemLanguageResultExecution timeMemory
875624josanneo22Islands (IOI08_islands)C++17
100 / 100
263 ms53408 KiB
/* Problem: P4381 [IOI2008] Island When: 2023-11-19 19:41:26 Author: Ning07 */ #include<bits/stdc++.h> using namespace std; using i64 = long long; const int NN=2e6; int N, A[NN], deg[NN]; i64 ans, f[NN], g[NN], W[NN]; i64 get(int p){ int st=p; p=A[p]; i64 m1=f[st],m2=f[st]; i64 s=W[st],ans1=g[st],ans2=-1E18; while (p != st) { deg[p] = 0; ans1=max(ans1,max(g[p],f[p]+s+m1)); ans2=max(ans2,f[p]-s+m2); m1=max(m1,f[p]-s),m2=max(m2,f[p]+s); s+=W[p],p=A[p]; } return max(ans1,ans2+s); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin>>N; for(int i=1;i<=N;i++){ cin>>A[i]>>W[i]; ++deg[A[i]]; } queue<int> q; for(int i=1;i<=N;i++) if (!deg[i]) q.push(i); while (!q.empty()){ int p=q.front(); q.pop(); i64 c=f[p]+W[p]; g[A[p]]=max(g[A[p]],max(f[A[p]]+c,g[p])); f[A[p]]=max(f[A[p]],c); if (!--deg[A[p]]) q.push(A[p]); } for(int i=1;i<=N;i++) if (deg[i]) ans += get(i); cout<<ans<<'\n'; }
#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...