Submission #588727

#TimeUsernameProblemLanguageResultExecution timeMemory
588727Bench0310Islands (IOI08_islands)C++17
80 / 100
468 ms131076 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<array<int,2>> v[n+1]; vector<array<int,3>> bad_edges; vector<int> dsu_p(n+1,0); for(int i=1;i<=n;i++) dsu_p[i]=i; vector<int> dsu_sz(n+1,1); function<int(int)> find_set=[&](int a)->int { if(a==dsu_p[a]) return a; else return dsu_p[a]=find_set(dsu_p[a]); }; auto merge_sets=[&](int a,int b)->int { a=find_set(a); b=find_set(b); if(a==b) return 0; if(dsu_sz[a]<dsu_sz[b]) swap(a,b); dsu_p[b]=a; dsu_sz[a]+=dsu_sz[b]; return 1; }; for(int a=1;a<=n;a++) { int b,c; cin >> b >> c; if(merge_sets(a,b)) { v[a].push_back({b,c}); v[b].push_back({a,c}); } else bad_edges.push_back({a,b,c}); } ll res=0; auto chmax=[&](ll &a,ll b){a=max(a,b);}; vector<int> u(n+1,0); vector<int> ucost(n+1,0); vector<bool> in_cycle(n+1,0); vector<ll> dp(n+1,0); vector<ll> down(n+1,0); vector<ll> lbest(n+1,0); vector<ll> rbest(n+1,0); for(auto [x,y,bad_cost]:bad_edges) { vector<int> cc; vector<int> cycle; function<void(int)> dfs=[&](int a) { cc.push_back(a); ll one=0,two=0; for(auto [to,c]:v[a]) { if(to==u[a]) continue; u[to]=a; ucost[to]=c; dfs(to); ll len=c+down[to]; if(len>one){two=one; one=len;} else if(len>two){two=len;} chmax(dp[a],dp[to]); chmax(down[a],len); } chmax(dp[a],one+two); }; dfs(x); ll now=dp[x]; int t=y; while(t!=0) { cycle.push_back(t); in_cycle[t]=1; t=u[t]; } for(int a:cc) down[a]=0; function<void(int,int)> go=[&](int a,int p) { for(auto [to,c]:v[a]) { if(to==p||in_cycle[to]) continue; go(to,a); chmax(down[a],c+down[to]); } }; for(int a:cycle) go(a,0); int len=cycle.size(); ll path=0; for(int i=0;i<len;i++) { if(i>0) lbest[cycle[i]]=lbest[cycle[i-1]]; chmax(lbest[cycle[i]],path+down[cycle[i]]); path+=ucost[cycle[i]]; } path=0; for(int i=len-1;i>=0;i--) { path+=ucost[cycle[i]]; if(i+1<len) rbest[cycle[i]]=rbest[cycle[i+1]]; chmax(rbest[cycle[i]],path+down[cycle[i]]); if(i>0) chmax(now,lbest[cycle[i-1]]+bad_cost+rbest[cycle[i]]); } res+=now; } cout << res << "\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...