Submission #1358106

#TimeUsernameProblemLanguageResultExecution timeMemory
1358106gayRobot (JOI21_ho_t4)C++20
0 / 100
85 ms24040 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <random>

//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    //cin >> q;
    while (q--) {
        solve();
    }
}

struct ed {
    ll u, c, p;
    bool operator<(ed x) const {
        return c < x.c;
    }
};

void solve() {
    ll n, m; cin >> n >> m;
    vector<vector<ed>> g(n + 2 * m);
    for (int i = 0; i < m; i++) {
        ll a, b, c, p; cin >> a >> b >> c >> p;
        a--, b--;
        g[a].push_back({i + n, c, p});
        g[i + n].push_back({b, c, 0});

        g[b].push_back({i + n + m, c, p});
        g[i + n + m].push_back({a, c, 0});
    }
    for (int i = 0; i < n; i++) {
        sort(g[i].begin(), g[i].end());
        ll l = 0;
        while (l < g[i].size()) {
            ll r = l;
            while (r < g[i].size() && g[i][r].c == g[i][l].c) {
                r++;
            }
            if (r - l > 2) {
                l = r;
                continue;
            }
            if (r - l == 1) {
                g[i][l].p = 0;
                l = r;
                continue;
            }
            ll u1 = g[i][l].u;
            ll u2 = u1 + m;
            if (u1 >= n + m) {
                u2 = u1 - m;
            }
            ll v1 = g[i][l + 1].u;
            ll v2 = v1 + m;
            if (v1 >= n + m) {
                v2 = v1 - m;
            }
            ll c = g[i][l].c;
            g[u2].push_back({v1, c, 0});
            g[v2].push_back({u1, c, 0});
            l = r;
        }
    }
    ll t = n - 1;
    n = (int)g.size();
    vector<ll> dist(n, INF);
    dist[0] = 0;
    set<pair<ll, ll>> dj;
    dj.insert({0, 0});
    while (!empty(dj)) {
        ll v = dj.begin()->second;
        dj.erase(dj.begin());
        for (auto [u, c, p] : g[v]) {
            if (dist[u] > dist[v] + p) {
                dj.erase({dist[u], u});
                dist[u] = dist[v] + p;
                dj.insert({dist[u], u});
            }
        }
    }
    if (dist[t] >= INF) cout << -1;
    else cout << dist[t];
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...