Submission #1147817

#TimeUsernameProblemLanguageResultExecution timeMemory
1147817mochaVoting Cities (NOI22_votingcity)C++20
100 / 100
113 ms35256 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int mx = 5e3+5; const int inf = 1e18; int n, m, k; int t[mx]; vector<pair<int, int>> g[mx<<5]; long long dis[mx<<5]; signed main() { cin >> n >> m >> k; for (int i=0;i<k;i++) cin >> t[i]; for (int i=0;i<m;i++) { int u, v, c; cin >> u >> v >> c; for (int j=0;j<1<<5;j++) { g[v<<5|j].push_back({u<<5|j, c}); for (int k=1;k<1<<5;k<<=1) { if (j&k) continue; g[v<<5|j].push_back({u<<5|j|k, c}); } } } fill(dis, dis+((n+1)<<5), inf); priority_queue<pair<int, int>> pq; for (int i=0;i<k;i++) { for (int j=0;j<1<<5;j++) { dis[t[i]<<5|j] = 0; pq.push({-0, t[i]<<5|j}); } } int mask = (1<<5)-1; while (pq.size()) { auto [d, u] = pq.top(); pq.pop(); d = -d; if (d != dis[u]) continue; for (auto [v, c]:g[u]) { if ((v&mask) == (u&mask)) { if (dis[v] > dis[u] + c) { dis[v] = dis[u] + c; pq.push({-dis[v], v}); } } else { int x = __lg((v&mask)^(u&mask)) + 1; if (dis[v] > dis[u] + c / 10 * (10-x)) { dis[v] = dis[u] + c / 10 * (10-x); pq.push({-dis[v], v}); } } } } int q; cin >> q; while (q--) { int s; int p[5]; cin >> s; for (int i=0;i<5;i++) cin >> p[i]; for (int i=0;i<5;i++) if (p[i]==-1) p[i] = inf; int ans = inf; for (int i=0;i<1<<5;i++) { int cnt = dis[s<<5|i]; for (int j=0;j<5;j++) { if ((1<<j)&i) { cnt += p[j]; } } ans = min(cnt, ans); } cout << (ans == inf ? -1 : ans) << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...