Submission #1313935

#TimeUsernameProblemLanguageResultExecution timeMemory
1313935SofiatpcIslands (IOI08_islands)C++20
80 / 100
677 ms138248 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 1e6+5; vector<int> adj[MAXN]; int f[MAXN], w[MAXN], in[MAXN], mx[2][MAXN], ansc[MAXN], marc[MAXN], comp; void dfs(int s){ marc[s] = 1; comp = max({comp, ansc[s], mx[0][s]+mx[1][s]}); for(int viz : adj[s]) if(!marc[viz])dfs(viz); } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; for(int i = 1; i <= n; i++){ cin>>f[i]>>w[i]; in[f[i]]++; adj[i].push_back(f[i]); adj[f[i]].push_back(i); } queue<int> q; for(int i = 1; i <= n; i++) if(in[i] == 0)q.push(i); while(!q.empty()){ int x = q.front(); q.pop(); in[ f[x] ]--; if(in[f[x]] == 0)q.push(f[x]); if(mx[0][f[x]] < mx[0][x] + w[x]){ mx[1][f[x]] = mx[0][f[x]]; mx[0][f[x]] = mx[0][x] + w[x]; }else if(mx[1][f[x]] < mx[0][x] + w[x])mx[1][f[x]] = mx[0][x] + w[x]; } for(int i = 1; i <= n; i++) if(in[i] == 1 && marc[i] == 0){ int cur = i, tot = 0; while(1){ marc[cur] = 1; tot += w[cur]; cur = f[cur]; if(cur == i)break; } int x = 0, y = 0, d = 0; cur = i; while(1){ if(cur != i){ ansc[cur] = max(x + mx[0][cur]+d, y + mx[0][cur]-d+tot); x = max(x, mx[0][cur]-d); y = max(y, mx[0][cur]+d); }else{ x = mx[0][cur]-d; y = mx[0][cur]+d; } d += w[cur]; cur = f[cur]; if(cur == i)break; } } for(int i = 1; i <= n; i++)marc[i] = 0; int ans = 0; for(int i = 1; i <= n; i++) if(!marc[i]){ comp = 0; dfs(i); ans += comp; } cout<<ans<<"\n"; }
#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...