Submission #386477

#TimeUsernameProblemLanguageResultExecution timeMemory
386477kostia244Islands (IOI08_islands)C++17
61 / 100
290 ms98284 KiB
#include<bits/stdc++.h> #define next uwuwuwuwu using namespace std; using ll = long long; const int maxn = 1e6 + 6; const ll inf = (1ll<<50); int n; int up[maxn]; ll dp[maxn], dep[maxn]; int tmp[maxn], tmp2[maxn], sz = 0, offset = 0, tsz = 0; bitset<maxn> vis; int link[maxn], next[maxn]; __attribute__(( always_inline)) inline void add_edge(int v, int ch) { next[ch] = link[v]; link[v] = ch; } ll ans; void dfs(int v) { #define u link[v] for(dp[v] = 0; u; u = next[u]) { dep[u] = dep[v] + up[u]; dfs(u); ans = max(ans, dep[u] + dp[v] + dp[u] + up[u]); dp[v] = max(dp[v], dp[u] + up[u]); } #undef u } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for(int i = 1; i <= n; i++) { cin >> up[i] >> dp[i]; } for(int i = 1; i <= n; i++) if(!vis[i]) { sz = offset; int v = i; while(!vis[v]) { tmp[sz] = v; tmp2[sz++] = dp[v]; vis[v] = 1; v = up[v]; } reverse(tmp+offset, tmp+sz); reverse(tmp2+offset, tmp2+sz); while(sz>offset && tmp[sz-1] != v) sz--; for(int i = offset+1; i < sz; i++) swap(tmp2[i], tmp2[i-1]); if(sz<=offset) continue;//no new cycle tmp2[sz-1] *= -1; offset = sz; } vis = 0; for(int i = 0; i < sz; i++) vis[tmp[i]] = 1; for(int i = 1; i <= n; i++) if(!vis[i]) { add_edge(up[i], i); } for(int i = 0; i < n; i++) up[i] = dp[i]; ll totalAns = 0, total = 0, pref = 0, A = -inf, B = -inf; for(int start = 0, end = 0; start < sz; start = ++end) { total = 0, pref = 0, A = -inf, B = -inf, ans = -inf; while(tmp2[end] >= 0) { total += tmp2[end]; end++; } for(int i = start; i <= end; i++) { dfs(tmp[i]); ans = max(ans, A + pref + dp[tmp[i]]); ans = max(ans, B + dp[tmp[i]] + (total-pref) - tmp2[end]); A = max(A, dp[tmp[i]]-pref); B = max(B, dp[tmp[i]]+pref); pref += tmp2[i]; } totalAns += ans; } cout << totalAns << '\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...