Submission #1174273

#TimeUsernameProblemLanguageResultExecution timeMemory
1174273sqrteipiCyberland (APIO23_cyberland)C++20
0 / 100
841 ms25216 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define REP(i, l, r) for (int i = l; i < r; i++) template <class T> using min_heap = priority_queue<T, vector<T>, greater<T>>; double solve(int N, int M, int K, int H, vector<int> X, vector<int> Y, vector<int> C, vector<int> ARR) { K = min(K, 50); const double INF = 1e18; vector<pair<int, int>> G[N + 1]; bool vis[N][K + 1]; double dist[N][K + 1]; REP(i, 0, N) REP(j, 0, K + 1) vis[i][j] = false, dist[i][j] = INF; REP(i, 0, M) G[X[i]].push_back({Y[i], C[i]}), G[Y[i]].push_back({X[i], C[i]}); REP(i, 0, K + 1) { min_heap<pair<double, int>> pq; REP(j, 0, N) { if (j == 0 || ARR[j] == 0) dist[j][i] = 0; for (auto [v, w] : G[j]) pq.push({dist[j][i] + w, v}); dist[j][i] = INF; if (j == 0 || ARR[j] == 0) dist[j][i] = 0; } while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if (vis[u][i]) continue; vis[u][i] = true; dist[u][i] = d; if (i < K) dist[u][i + 1] = min(dist[u][i + 1], d / 2); for (auto [v, w] : G[u]) { if (dist[u][i] + w < dist[v][i]) { dist[v][i] = dist[u][i] + w; pq.push({dist[v][i], v}); } } } } return *min_element(dist[H], dist[H] + K + 1); } // int main() { // // cout << fixed << setprecision(10) << solve(3, 2, 30, 2, {1, 2}, {2, 0}, {12, 4}, {1, 2, 1}); // cout << fixed << setprecision(10) << solve(4, 4, 30, 3, {0, 0, 1, 2}, {1, 2, 3, 3}, {5, 4, 2, 4}, {1, 0, 2, 1}); // }
#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...