Submission #775927

#TimeUsernameProblemLanguageResultExecution timeMemory
775927SharkyCyberland (APIO23_cyberland)C++17
49 / 100
1187 ms32440 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; #define int long long const double INF = 1E18; struct node { double di; int u, k; bool operator > (const node& o) const { return di < o.di; } }; double solve(int32_t N, int32_t M, int32_t K, int32_t H, std::vector<int32_t> x, std::vector<int32_t> y, std::vector<int32_t> c, std::vector<int32_t> arr) { K = min(K, min(N, 90)); vector<pair<int, int>> adj[N]; vector<vector<double>> d(N, vector<double> (K + 1, INF)); for (int i = 0; i < M; i++) { if (x[i] != H) adj[x[i]].push_back({y[i], c[i]}); if (y[i] != H) adj[y[i]].push_back({x[i], c[i]}); } queue<int> q; vector<bool> vis(N, 0); vis[0] = 1; q.push(0); while (!q.empty()) { int u = q.front(); q.pop(); for (auto& [v, w] : adj[u]) { if (!vis[v]) { vis[v] = true; q.push(v); } } } using T = node; priority_queue<T, vector<T>, greater<T>> pq; pq.push({0.0, 0, 0}); d[0][0] = 0.0; for (int i = 0; i < N; i++) if (arr[i] == 0 && vis[i]) { pq.push({0.0, i, 0}); d[i][0] = 0.0; } for (int i = 1; i <= K; i++) { while (!pq.empty()) { auto [di, u, k] = pq.top(); pq.pop(); if (di != d[u][k]) continue; for (auto& [v, w] : adj[u]) { if (arr[v] == 0 || arr[v] == 2) continue; double new_weight = d[u][k] + w; if (d[v][k] > new_weight) { d[v][k] = new_weight; pq.push((node) {d[v][k], v, k}); } } } for (int j = 0; j < N; j++) pq.push({d[j][i - 1], j, i - 1}); while (!pq.empty()) { auto [di, u, k] = pq.top(); pq.pop(); if (di != d[u][k] || k >= i) continue; for (auto& [v, w] : adj[u]) { if (arr[v] == 0 || arr[v] == 1) continue; if (arr[v] == 2 && k != K) { double new_weight = d[u][k] + w; new_weight /= 2.0; if (d[v][k + 1] > new_weight) { d[v][k + 1] = new_weight; pq.push((node) {d[v][k + 1], v, k + 1}); } } } } for (int j = 0; j < N; j++) pq.push({d[j][i], j, i}); } // for (int i = 0; i <= H; i++) { // for (int j = 0; j <= K; j++) { // cout << i << " " << j << " "; // cout << fixed << setprecision(6) << d[i][j] << "\n"; // } // } double res = *min_element(d[H].begin(), d[H].end()); if (res == INF) return -1; return res; }
#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...