Submission #1049125

#TimeUsernameProblemLanguageResultExecution timeMemory
1049125duckindogToll (BOI17_toll)C++17
100 / 100
1051 ms33232 KiB
#include <bits/stdc++.h> using namespace std; const int N = 50'000 + 10, S = 400; int k, n, m, q; vector<pair<int, int>> ad[N]; void preSktra(int st, vector<int>& f) { f = vector<int>(n + 1, 1'000'000'000); using pii = pair<int, int>; priority_queue<pii, vector<pii>, greater<>> q; q.push({f[st] = 0, st}); while (q.size()) { auto [d, u] = q.top(); q.pop(); if (d != f[u]) continue; for (const auto& [v, w] : ad[u]) { if (f[v] > d + w) q.push({f[v] = d + w, v}); } } } int id[N], rvs[N], it; vector<int> pF[S + 10]; int f[N]; int sktra(int st, int ed) { int ret = 1'000'000'000; using pii = pair<int, int>; priority_queue<pii, vector<pii>, greater<>> q; q.push({f[st] = 0, st}); vector<int> vt; while (q.size()) { auto [d, u] = q.top(); q.pop(); vt.push_back(u); if (d != f[u]) continue; if (id[u]) { ret = min(ret, f[u] + pF[id[u]][ed]); continue; } for (const auto& [v, w] : ad[u]) { if (f[v] > d + w) q.push({f[v] = d + w, v}); } } ret = min(ret, f[ed]); for (const auto& i : vt) f[i] = 1'000'000'000; return ret >= 1'000'000'000 ? -1 : ret; } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> k >> n >> m >> q; for (int i = 1; i <= m; ++i) { int u, v, w; cin >> u >> v >> w; ad[u].push_back({v, w}); } for (int i = 0; i < n; ++i) { if ((i / k) % S == 0) preSktra(i, pF[id[i] = ++it]); } memset(f, 63, sizeof f); while (q--) { int a, b; cin >> a >> b; cout << sktra(a, b) << "\n"; } }
#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...