Submission #575138

#TimeUsernameProblemLanguageResultExecution timeMemory
575138d4xnDreaming (IOI13_dreaming)C++17
100 / 100
95 ms15180 KiB
#pragma GCC optimize ("Ofast") #include "dreaming.h" #include <bits/stdc++.h> using namespace std; const int N = 1e5+5, inf = INT_MAX; int n, mxDis, furthest, mn, ans; vector<int> dp, distances; vector<pair<int, int>> adj[N]; bitset<N> vis; void getFurthest(int u, int par, int d) { vis[u] = 1; if (d > mxDis) { mxDis = d; furthest = u; ans = max(ans, d); } for (auto &[v, w] : adj[u]) { if (v == par) continue; getFurthest(v, u, d+w); } } void dfs(int u, int par, int d, bool b) { vis[u] = 1; dp[u] = max(dp[u], d); if (b && dp[u] < mn) mn = dp[u]; for (auto &[v, w] : adj[u]) { if (v == par) continue; dfs(v, u, d+w, b); } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { n = N; ans = 0; dp.resize(n, 0); for (int i = 0; i < M; i++) { adj[A[i]].push_back(make_pair(B[i], T[i])); adj[B[i]].push_back(make_pair(A[i], T[i])); } for (int i = 0; i < n; i++) { if (vis[i]) continue; mxDis = -1; getFurthest(i, -1, 0); int a = furthest; mxDis = -1; getFurthest(a, -1, 0); int b = furthest; mn = inf; dfs(a, -1, 0, 0); dfs(b, -1, 0, 1); distances.push_back(mn); } sort(distances.rbegin(), distances.rend()); if (distances.size() >= 3) { return max({ans, 2*L + distances[1] + distances[2], L + distances[0] + distances[1]}); } else if (distances.size() == 2) { return max(ans, L + distances[0] + distances[1]); } else { return max(ans, distances[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...