Submission #1161097

#TimeUsernameProblemLanguageResultExecution timeMemory
1161097daoquanglinh2007Cyberland (APIO23_cyberland)C++20
97 / 100
2387 ms119996 KiB
#include <bits/stdc++.h> using namespace std; #define pii pair <int, int> #define fi first #define se second #define mp make_pair const int NM = 1e5, KM = 60; const double inf = 1e18; int N, M, K, H; vector <pii> adj[NM+5]; vector <int> arr; bool mark[NM+5]; double d[NM+5][KM+5][2]; priority_queue <pair <double, pii>, vector <pair <double, pii> >, greater <pair <double, pii> > > pq; double ans; void dfs(int u){ mark[u] = 1; for (pii _ : adj[u]){ int v = _.fi; if (v == H || mark[v]) continue; dfs(v); } } void dijkstra(){ for (int t = 0; t <= K; t++){ while (!pq.empty()) pq.pop(); for (int i = 0; i < N; i++){ if (t == 0){ if (i == 0 || (arr[i] == 0 && mark[i])) d[i][t][0] = 0, d[i][t][1] = +inf; else d[i][t][0] = d[i][t][1] = +inf; } else{ if (arr[i] == 2){ d[i][t][0] = d[i][t-1][0]; d[i][t][1] = d[i][t-1][1]; if (d[i][t-1][0] != +inf){ d[i][t][1] = min(d[i][t][1], d[i][t-1][0]*0.5); } } else{ d[i][t][0] = d[i][t-1][0]; d[i][t][1] = +inf; } if (i == H) d[i][t][0] = d[i][t][1] = +inf; } } while (!pq.empty()) pq.pop(); for (int i = 0; i < N; i++) for (int j = 0; j < 2; j++) pq.push(mp(d[i][t][j], mp(i, j))); while (!pq.empty()){ int u = pq.top().se.fi, j = pq.top().se.se; if (d[u][t][j] != pq.top().fi){ pq.pop(); continue; } pq.pop(); if (u == H || d[u][t][j] == +inf) continue; for (pii _ : adj[u]){ int v = _.fi, c = _.se; if (d[u][t][j]+(double)c < d[v][t][0]){ d[v][t][0] = d[u][t][j]+(double)c; pq.push(mp(d[v][t][0], mp(v, 0))); } } } ans = min(ans, d[H][t][0]); } } double solve(int _N, int _M, int _K, int _H, vector <int> x, vector <int> y, vector <int> c, vector <int> _arr){ N = _N, M = _M, K = _K, H = _H; K = min(K, KM); for (int i = 0; i < N; i++){ adj[i].clear(); mark[i] = 0; } for (int i = 0; i < M; i++){ adj[x[i]].push_back(mp(y[i], c[i])); adj[y[i]].push_back(mp(x[i], c[i])); } dfs(0); arr = _arr; ans = +inf; dijkstra(); if (ans == +inf) ans = -1; 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...