제출 #588735

#제출 시각아이디문제언어결과실행 시간메모리
588735Bench0310Islands (IOI08_islands)C++17
90 / 100
807 ms131072 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1000001; int u[N]; int vidx[N]; int ucost[N]; ll dp[N]; ll down[N]; array<int,3> v[2*N]; int vsz=0; int badidx=2*N; int cycle[N]; int cyclesz=0; int in_cycle=0; int find_set(int a) { if(a==u[a]) return a; else return u[a]=find_set(u[a]); } int merge_sets(int a,int b) { a=find_set(a); b=find_set(b); if(a==b) return 0; u[b]=a; return 1; } void chmax(ll &a,ll b){a=max(a,b);} void dfs(int a) { cycle[cyclesz++]=a; ll one=0,two=0; for(int i=vidx[a];i<vsz&&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); } void go(int a,int p) { for(int i=vidx[a];i<vsz&&v[i][0]==a;i++) { auto [_,to,c]=v[i]; if(to==p||to==in_cycle) continue; go(to,a); chmax(down[a],c+down[to]); } } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i=1;i<=n;i++) u[i]=i; for(int a=1;a<=n;a++) { int b,c; cin >> b >> c; if(merge_sets(a,b)) { v[vsz++]={a,b,c}; v[vsz++]={b,a,c}; } else v[--badidx]={a,b,c}; } sort(v,v+vsz); for(int i=vsz-1;i>=0;i--) vidx[v[i][0]]=i; ll res=0; memset(u,0,sizeof(u)); for(int o=2*N-1;o>=badidx;o--) { auto [x,y,bad_cost]=v[o]; dfs(x); ll now=dp[x]; for(int i=0;i<cyclesz;i++) down[cycle[i]]=dp[cycle[i]]=0; cyclesz=0; int t=y; while(t!=0) { cycle[cyclesz++]=t; t=u[t]; } for(int i=0;i<cyclesz;i++) { if(i+1<cyclesz) in_cycle=cycle[i+1]; go(cycle[i],(i>0?cycle[i-1]:0)); } ll path=0; for(int i=0;i<cyclesz;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=cyclesz-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; cyclesz=0; } 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...