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...