Submission #101053

#TimeUsernameProblemLanguageResultExecution timeMemory
101053maruiiIslands (IOI08_islands)C++14
21 / 100
1367 ms132096 KiB
#include <bits/stdc++.h> using namespace std; bool vis[1000001]; vector<pair<int, int> > edge[1000001]; long long dp1[1000001], dp2[1000001]; vector<int> vec; void dfs(int x){ vec.push_back(x); vis[x] = 1; dp1[x] = dp2[x] = 0; long long mx1 = 0, mx2 = 0; for(auto i: edge[x]){ if(vis[i.second]) continue; dfs(i.second); dp1[x] = max(dp1[x], dp1[i.second]); long long t = dp2[i.second]+i.first; dp2[x] = max(dp2[x], t); if(mx1 <= t) mx2 = mx1, mx1 = t; else if(mx2 < t) mx2 = t; } dp1[x] = max(dp1[x], mx1+mx2); } long long getD(int x){ dfs(x); return dp1[x]; } int main(){ ios_base::sync_with_stdio(0), cin.tie(0); int N; cin>>N; for(int i=1; i<=N; ++i){ int a,b; cin>>a>>b; edge[i].push_back({b, a}); edge[a].push_back({b, i}); } long long ans = 0; for(int i=1; i<=N; ++i){ if(vis[i]) continue; long long t = getD(i); for(auto j: vec) reverse(edge[j].begin(), edge[j].end()), vis[j] = 0; vec.clear(); t = max(t, getD(i)); vec.clear(); ans += t; } cout<<ans; 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...