Submission #1318438

#TimeUsernameProblemLanguageResultExecution timeMemory
1318438ayazDreaming (IOI13_dreaming)C++20
100 / 100
49 ms9132 KiB
#pragma GCC optimize("O3") #include "bits/stdc++.h" #include "dreaming.h" using namespace std; vector<vector<array<int, 2>>> g; vector<bool> used; vector<int> dis1, dis2, nodes, par; int n; pair<int, int> findDiameter(int u) { queue<int> q; q.push(u); dis1[u] = 0; int start = u; while (!q.empty()) { auto v = q.front(); q.pop(); for (auto &[u, w] : g[v]) { if (dis1[u] == 1e9) { dis1[u] = dis1[v] + w; if (dis1[u] > dis1[start]) start = u; q.push(u); } } } q.push(start); dis2[start] = 0; par[start] = -1; int finish = start; while (!q.empty()) { auto v = q.front(); q.pop(); used[v] = 1; for (auto &[u, w] : g[v]) { if (dis2[u] == 1e9) { dis2[u] = dis2[v] + w; par[u] = v; if (dis2[u] > dis2[finish]) finish = u; q.push(u); } } } int mid = 1e9, nodeMid = 0; for (int v = finish; v != -1; v = par[v]) { int cur = max(dis2[v], dis2[finish]- dis2[v]); if (cur <= mid) { nodeMid = v; mid = cur; } } return {dis2[finish], nodeMid}; } array<int, 2> findCenter(int u) { auto [diameter, mid] = findDiameter(u); return {max(diameter - dis2[mid], dis2[mid]), mid}; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { int m = M, l = L; n = N; dis1.resize(n + 1, 1e9); dis2.resize(n + 1, 1e9); par.resize(n + 1, 0); g.resize(n + 1); used.assign(n + 1, false); for (int i = 0; i < m; i++) { int u = A[i], v = B[i], w = T[i]; u++, v++; g[u].push_back({v, w}); g[v].push_back({u, w}); } vector<array<int, 2>> mx; for (int u = 1; u <= n; u++) { if (used[u]) { assert(dis2[u] != 1e9 && dis1[u] != 1e9); continue; } mx.push_back(findCenter(u)); } sort(mx.rbegin(), mx.rend()); for (int i = 1; i < size(mx); i++) { g[mx[i][1]].push_back({mx[0][1], l}); g[mx[0][1]].push_back({mx[i][1], l}); } int ans = 0; fill(dis1.begin(), dis1.end(), 1e9); fill(dis2.begin(), dis2.end(), 1e9); ans = findDiameter(1).first; 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...