제출 #408931

#제출 시각아이디문제언어결과실행 시간메모리
408931JasiekstrzIslands (IOI08_islands)C++17
100 / 100
1059 ms131072 KiB
#include<bits/stdc++.h> #define fi first #define se second using namespace std; const int N=1e6; vector<int> e[N+10]; int f[N+10]; int l[N+10]; bitset<N+10> vis_fill; bitset<N+10> vis_s; bitset<N+10> on_cycle; vector<int> t; void dfs_fill(int x) { t.push_back(x); vis_fill[x]=true; for(int &v:e[x]) { if(!vis_fill[v]) dfs_fill(v); } return; } long long aa; long long dfs_tree(int x) { on_cycle[x]=true; long long ans=0; for(int &v:e[x]) { if(on_cycle[v]) continue; long long tmp=dfs_tree(v); aa=max(aa,ans+tmp+(v==f[x] ? l[x]:l[v])); ans=max(ans,tmp+(v==f[x] ? l[x]:l[v])); } 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++) { cin>>f[i]>>l[i]; e[i].push_back(f[i]); e[f[i]].push_back(i); } long long ans=0; for(int j=1;j<=n;j++) { if(!vis_fill[j]) { t.clear(); dfs_fill(j); long long ans_s=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]; aa=0; long long ww=dfs_tree(x); ans_s=max(ans_s,aa); ans_s=max({ans_s,mx+ww,mn+ww}); mx=max(mx,ww)+l[x]; mn=max(mn,ww+l_all)-l[x]; }while(x!=c); ans+=ans_s; } } 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...