Submission #588730

#TimeUsernameProblemLanguageResultExecution timeMemory
588730Bench0310Islands (IOI08_islands)C++17
90 / 100
909 ms131072 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,3>> v; vector<array<int,3>> bad_edges; vector<int> u(n+1,0); for(int i=1;i<=n;i++) u[i]=i; function<int(int)> find_set=[&](int a)->int { if(a==u[a]) return a; else return u[a]=find_set(u[a]); }; auto merge_sets=[&](int a,int b)->int { a=find_set(a); b=find_set(b); if(a==b) return 0; u[b]=a; return 1; }; for(int a=1;a<=n;a++) { int b,c; cin >> b >> c; if(merge_sets(a,b)) { v.push_back({a,b,c}); v.push_back({b,a,c}); } else bad_edges.push_back({a,b,c}); } sort(v.begin(),v.end()); vector<int> vidx(n+1,0); for(int i=(int)v.size()-1;i>=0;i--) vidx[v[i][0]]=i; ll res=0; auto chmax=[&](ll &a,ll b){a=max(a,b);}; u.assign(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); 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(int i=vidx[a];i<(int)v.size()&&v[i][0]==a;i++) { auto [_,to,c]=v[i]; 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]=dp[a]=0; function<void(int,int)> go=[&](int a,int p) { for(int i=vidx[a];i<(int)v.size()&&v[i][0]==a;i++) { auto [_,to,c]=v[i]; 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) dp[cycle[i]]=dp[cycle[i-1]]; chmax(dp[cycle[i]],path+down[cycle[i]]); path+=ucost[cycle[i]]; } path=0; ll opt=0; for(int i=len-1;i>=0;i--) { path+=ucost[cycle[i]]; chmax(opt,path+down[cycle[i]]); if(i>0) chmax(now,dp[cycle[i-1]]+bad_cost+opt); } 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...