Submission #838771

#TimeUsernameProblemLanguageResultExecution timeMemory
838771arbuzickCyberland (APIO23_cyberland)C++17
100 / 100
1297 ms119884 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; constexpr long double inf = 1e16 + 100; double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) { vector<vector<pair<int, int>>> g(n); for (int i = 0; i < m; ++i) { g[x[i]].emplace_back(y[i], c[i]); g[y[i]].emplace_back(x[i], c[i]); } vector<int> used(n); used[0] = 1; queue<int> q; q.push(0); while (!q.empty()) { int v = q.front(); q.pop(); if (v == h) { continue; } for (auto [u, w] : g[v]) { if (!used[u]) { used[u] = 1; q.push(u); } } } if (!used[h]) { return -1; } k = min(k, 67); vector<vector<long double>> dist(k + 1, vector<long double>(n, inf)); priority_queue<pair<long double, int>> s_nw, s_nxt; dist[0][0] = 0; s_nxt.push({-dist[0][0], 0}); for (int i = 0; i < n; ++i) { if (used[i] && arr[i] == 0) { dist[0][i] = 0; s_nxt.push({-dist[0][i], i}); } } used.assign(n, -1); for (int i = 0; i <= k; ++i) { s_nw.swap(s_nxt); while (!s_nw.empty()) { int v = s_nw.top().second; s_nw.pop(); if (used[v] == i) { continue; } used[v] = i; if (v == h) { continue; } if (dist[i][v] >= inf - 10) { continue; } for (auto [u, w] : g[v]) { if (dist[i][u] > dist[i][v] + w) { dist[i][u] = dist[i][v] + w; s_nw.push({-dist[i][u], u}); } if (arr[v] == 2 && i + 1 <= k && dist[i + 1][u] > dist[i][v] / 2.0 + w) { dist[i + 1][u] = dist[i][v] / 2.0 + w; s_nxt.push({-dist[i + 1][u], u}); } } } } long double ans = inf; for (int i = 0; i <= k; ++i) { ans = min(ans, dist[i][h]); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...