Submission #920588

#TimeUsernameProblemLanguageResultExecution timeMemory
920588boyliguanhanIslands (IOI08_islands)C++17
100 / 100
246 ms52196 KiB
#include<bits/stdc++.h> using namespace std; #define N 1000100 #define ll long long int deg[N]; #define ck(a,b) a=max(a,b) #define Ck(a,b,c) a=max({a,b,c}) ll v[N], l[N], O[N], I[N]; ll solve(int x) { ll mx1=O[x],mx2=O[x],sum=l[x],ans1=I[x],ans2=-1e18; for(int y=v[x];y-x;sum+=l[y],deg[y]=0,y=v[y]) { Ck(ans1,O[y]+sum+mx1,I[y]); ck(ans2,O[y]-sum+mx2); ck(mx1,O[y]-sum); ck(mx2,O[y]+sum); } return max(ans1,ans2+sum); } int main() { cin.sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; for(int i=1;i<=n;i++) cin>>v[i]>>l[i],deg[v[i]]++; queue<int> q; for(int i=1;i<=n;i++) if(!deg[i])q.push(i); while (q.size()) { int x=q.front(),y=v[x]; q.pop(); Ck(I[y],O[y]+O[x]+l[x],I[x]); ck(O[y],O[x]+l[x]); if(!--deg[y])q.push(y); } ll ans=0; for(int i=1;i<=n;i++) if(deg[i]) ans+=solve(i),deg[i]=0; cout<<ans; }
#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...