Submission #408896

#TimeUsernameProblemLanguageResultExecution timeMemory
408896JasiekstrzIslands (IOI08_islands)C++17
90 / 100
1060 ms131076 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; pair<long long,long long> ww[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]) dfs_fill(v); } return; } void dfs_tree(int x) { on_cycle[x]=true; for(auto v:e[x]) { if(!on_cycle[v]) { dfs_tree(v); ww[x].fi=max({ww[x].fi,ww[v].fi,ww[x].se+ww[v].se+(v==f[x] ? l[x]:l[v])}); ww[x].se=max(ww[x].se,ww[v].se+(v==f[x] ? l[x]:l[v])); } } return; } 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]; dfs_tree(x); ans=max(ans,ww[x].fi); ans=max({ans,mx+ww[x].se,mn+ww[x].se}); mx=max(mx,ww[x].se)+l[x]; mn=max(mn,ww[x].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); e[a].emplace_back(i); } 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...