Submission #1149404

#TimeUsernameProblemLanguageResultExecution timeMemory
1149404SalihSahinDreaming (IOI13_dreaming)C++20
100 / 100
63 ms12876 KiB
#include<bits/stdc++.h> #include "dreaming.h" #define pb push_back using namespace std; const int MAXN = 1e5 + 5; vector<pair<int, int> > adj[MAXN]; vector<int> dis(MAXN), vis(MAXN), p(MAXN); int mx, mxi; void dfs(int node, int par, int len){ p[node] = par; dis[node] = len; vis[node] = 1; if(dis[node] > mx){ mx = dis[node]; mxi = node; } for(auto itr: adj[node]){ if(itr.first != par){ dfs(itr.first, node, len + itr.second); } } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { priority_queue<int> pq; for(int i = 0; i < M; i++){ adj[A[i]].pb({B[i], T[i]}); adj[B[i]].pb({A[i], T[i]}); } int ans = 0; for(int i = 0; i < N; i++){ if(vis[i]) continue; mx = mxi = -1; dfs(i, i, 0); int a = mxi; mx = mxi = -1; dfs(a, a, 0); int b = mxi; // a -> b int best = dis[b], node = b; while(true){ best = min(best, max(dis[node], dis[b] - dis[node])); if(node == p[node]) break; node = p[node]; } ans = max(ans, dis[b]); pq.push(best); } if(pq.size() == 1){ ans = max(ans, pq.top()); } else if(pq.size() == 2){ int sum = 0; while(pq.size()){ sum += pq.top(); pq.pop(); } sum += L; ans = max(ans, sum); } else{ int mx1 = pq.top(); pq.pop(); int mx2 = pq.top(); pq.pop(); int mx3 = pq.top(); pq.pop(); ans = max({ans, mx1 + mx2 + L, mx2 + mx3 + 2 * L}); } return ans; }
#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...