Submission #1312899

#TimeUsernameProblemLanguageResultExecution timeMemory
1312899julia_08Islands (IOI08_islands)C++20
43 / 100
237 ms125876 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 2e6 + 10; const int INF = 1e18; int pai[MAXN], marc[MAXN], deg[MAXN]; int dp[MAXN], dp2[MAXN]; pair<int, int> best[MAXN]; vector<pair<int, int>> adj[MAXN]; int n; int tot = 0; void lenhadora(){ queue<int> q; for(int i=1; i<=n; i++) pai[i] = i; for(int i=1; i<=n; i++){ if(deg[i] == 1){ q.push(i); marc[i] = 1; } } while(!q.empty()){ int v = q.front(); q.pop(); dp2[v] = max(dp2[v], best[v].first + best[v].second); for(auto [u, w] : adj[v]){ deg[u] --; if(marc[u]) continue; pai[v] = u; dp[u] = max(dp[u], dp[v] + w); dp2[u] = max(dp2[u], dp2[v]); if(dp[v] + w >= best[u].first){ best[u] = {dp[v] + w, best[u].first}; } else best[u].second = max(best[u].second, dp[v]); if(deg[u] < 2){ q.push(u); marc[u] = 1; } } } for(int i=1; i<=n; i++) marc[i] = 0; } void process(int v){ int cur = 0; int max_a = -INF, max_b = -INF; vector<pair<int, int>> cycle; int sz = 0; while(!marc[v]){ marc[v] = 1; pair<int, int> nxt = {0, 0}; for(auto [u, w] : adj[v]){ if(!marc[u] && pai[u] == u){ if(nxt.first){ sz += w; } else nxt = {u, w}; } } cycle.push_back({v, nxt.second}); sz += nxt.second; v = nxt.first; } int d = 0; for(auto [v, w] : cycle){ cur = max(cur, max_a + dp[v] + d); cur = max(cur, max_b + dp[v] + sz - d); cur = max(cur, dp2[v]); max_a = max(max_a, dp[v] - d); max_b = max(max_b, dp[v] + d); d += w; } tot += cur; } int32_t main(){ cin.tie(0)->sync_with_stdio(0); cin >> n; for(int i=1; i<=n; i++){ int a, b; cin >> a >> b; adj[i].push_back({a, b}); adj[a].push_back({i, b}); deg[i] ++; deg[a] ++; } lenhadora(); for(int i=1; i<=n; i++){ if(marc[i] || pai[i] != i) continue; process(i); } cout << tot << "\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...