Submission #1230655

#TimeUsernameProblemLanguageResultExecution timeMemory
1230655biankRobot (JOI21_ho_t4)C++20
100 / 100
273 ms40876 KiB
#include <bits/stdc++.h>

using namespace std;

#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

using ll = long long;
using ld = long double;
using vi = vector<int>;
using vb = vector<bool>;
using vll = vector<ll>;
using ii = pair<int, int>;
using iii = tuple<int, int, ll>;

#define fst first
#define snd second

#define pb push_back
#define eb emplace_back

const ll INF = 1e18;

struct Edge {
    int u, v, c; 
    ll p;
};

template<typename T>
int pos(vector<T> &vals, T x) {
    return int(lower_bound(all(vals), x) - begin(vals));
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    int n, m;
    cin >> n >> m;
    vector<Edge> graph(m);
    vector<vector<iii>> adj(n);
    vector<vi> colors(n, vi(1, -1));
    vector<vll> sum(n);
    for (auto &[u, v, c, p] : graph) {
        cin >> u >> v >> c >> p;
        --u, --v;
        colors[u].pb(c);
        colors[v].pb(c);
        adj[u].eb(c, v, p);
        adj[v].eb(c, u, p);
    }
    forn(u, n) {
        sort(all(adj[u]));
        sort(all(colors[u]));
        colors[u].erase(unique(all(colors[u])), end(colors[u]));
        sum[u].assign(sz(colors[u]), 0LL);
    }
    for (auto &[u, v, c, p] : graph) {
        sum[u][pos(colors[u], c)] += p;
        sum[v][pos(colors[v], c)] += p;
    }
    vector<vll> dist(n);
    forn(u, n) dist[u].assign(sz(colors[u]), INF);
    priority_queue<tuple<ll, int, int>> pq;
    auto PUSH = [&](int u, int c, ll d) {
        if (d < dist[u][c]) {
            dist[u][c] = d;
            pq.emplace(-dist[u][c], u, c);
        }
    };
    PUSH(0, 0, 0LL);
    while (!pq.empty()) {
        auto [d, u, c] = pq.top();
        pq.pop(); d *= -1;
        if (dist[u][c] != d) continue;
        if (c != 0) {
            int lo = pos(adj[u], iii{colors[u][c], 0, 0});
            int hi = pos(adj[u], iii{colors[u][c] + 1, 0, 0});
            forsn(id, lo, hi) {
                auto [_, v, p] = adj[u][id];
                PUSH(v, 0, d + sum[u][c] - p);
            }
        } else {
            for (auto [k, v, p] : adj[u]) {
                PUSH(v, pos(colors[v], k), d);
                PUSH(v, 0, d + min(p, sum[u][pos(colors[u], k)] - p));
            }
        }
    }
    if (dist[n - 1][0] == INF) cout << "-1\n";
    else cout << dist[n - 1][0] << '\n';
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...