Submission #408866

#TimeUsernameProblemLanguageResultExecution timeMemory
408866JasiekstrzIslands (IOI08_islands)C++17
90 / 100
1063 ms131076 KiB
#include<bits/stdc++.h> #define fi first #define se second using namespace std; const int N=1e6; vector<pair<int,int>> e[N+10]; int f[N+10]; int l[N+10]; bool vis_fill[N+10]; bool vis_s[N+10]; bool on_cycle[N+10]; void dfs_fill(int x,vector<int> &vec) { vec.push_back(x); vis_fill[x]=true; for(auto v:e[x]) { if(!vis_fill[v.fi]) dfs_fill(v.fi,vec); } return; } pair<long long,long long> dfs_tree(int x,int p) { pair<long long,long long> ans={0,0}; for(auto v:e[x]) { if(on_cycle[v.fi] || v.fi==p) continue; auto tmp=dfs_tree(v.fi,x); ans.fi=max({ans.fi,tmp.fi,ans.se+tmp.se+v.se}); ans.se=max(ans.se,tmp.se+v.se); } ans.fi=max(ans.fi,ans.se); return ans; } long long solve(vector<int> &t) { long long ans=0; int c; for(int i=t[0];true;i=f[i]) { if(vis_s[i]) { c=i; break; } vis_s[i]=true; } long long l_all=l[c]; vector<int> cycle={c}; on_cycle[c]=true; for(int i=f[c];i!=c;l_all+=l[i],i=f[i]) { on_cycle[i]=true; cycle.push_back(i); } long long mx=0,mn=0; for(size_t i=0;i<cycle.size();i++) { auto ww=dfs_tree(cycle[i],0); ans=max(ans,ww.fi); ans=max({ans,mx+ww.se,mn+ww.se}); mx=max(mx,ww.se)+l[cycle[i]]; mn=max(mn,ww.se+l_all)-l[cycle[i]]; } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin>>n; for(int i=1;i<=n;i++) { int a,b; cin>>a>>b; f[i]=a; l[i]=b; e[i].emplace_back(a,b); e[a].emplace_back(i,b); } long long ans=0; for(int i=1;i<=n;i++) { if(!vis_fill[i]) { vector<int> tmp; dfs_fill(i,tmp); ans+=solve(tmp); } } 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...