제출 #408876

#제출 시각아이디문제언어결과실행 시간메모리
408876JasiekstrzIslands (IOI08_islands)C++17
90 / 100
1045 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]; vector<int> t; void dfs_fill(int x) { t.push_back(x); vis_fill[x]=true; for(auto v:e[x]) { if(!vis_fill[v.fi]) dfs_fill(v.fi); } return; } pair<long long,long long> dfs_tree(int x) { on_cycle[x]=true; pair<long long,long long> ans={0,0}; for(auto v:e[x]) { if(on_cycle[v.fi]) continue; auto tmp=dfs_tree(v.fi); 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() { 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]; on_cycle[c]=true; for(int i=f[c];i!=c;l_all+=l[i],i=f[i]) on_cycle[i]=true; long long mx=0,mn=0; int x=c; do{ x=f[x]; auto ww=dfs_tree(x); ans=max(ans,ww.fi); ans=max({ans,mx+ww.se,mn+ww.se}); mx=max(mx,ww.se)+l[x]; mn=max(mn,ww.se+l_all)-l[x]; }while(x!=c); 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]) { t.clear(); dfs_fill(i); ans+=solve(); } } 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...