제출 #1324531

#제출 시각아이디문제언어결과실행 시간메모리
1324531haithamcoderCircle Passing (EGOI24_circlepassing)C++20
0 / 100
2099 ms132056 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;

const ll LOG = 31;
const ll MOD = 1000000007;
const ll inf = 1e17;
const ll B = 2305843009213693951;


#define db(x) cerr << #x << " = " << x << " | "
#define dbg(x) cerr << #x << " = " << x << "\n"

#define Algerian ios::sync_with_stdio(0);
#define OI cin.tie(NULL);

ll d(ll src, ll dst, map<ll, vector<pll>>& adj) {
    priority_queue<pll, vector<pll>, greater<>> pq;

    map<ll, ll> dist;
    dist[src] = 0;
    pq.push({0, src});

    while (pq.size()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d != dist[u]) continue;

        for (auto [v, wt] : adj[u]) {
            if (dist.find(v) == dist.end() || (dist[u] + wt < dist[v])) {
                dist[v] = dist[u] + wt;
                pq.push({dist[v], v});
            }
        }
    }

    return dist[dst];
};

int main() {
    Algerian OI

    ll n, m, q;
    cin >> n >> m >> q;

    vector<ll> a(m);
    // map<ll, vector<pll>> adj;
    map<ll, bool> has;
    map<ll, ll> d;

    for (ll i = 0; i < m; i++) {
        cin >> a[i];
        has[a[i]] = has[a[i] + n] = 1;
        d[a[i]] = d[a[i] + n] = inf;
        // adj[a[i]].push_back({a[i] + n, 1});
        // adj[a[i] + n].push_back({a[i], 1});
    }

    auto dist = [&](ll a, ll b) -> ll {
        if (a > b) swap(a, b);
        return min(b - a, 2 * n - (b - a));
    };

    // for (ll i = 0; i < m - 1; i++) {
    //     adj[a[i]].push_back({a[i + 1], dist(a[i], a[i + 1])});
    //     adj[a[i + 1]].push_back({a[i], dist(a[i], a[i + 1])});
    //     adj[a[i] + n].push_back({a[i + 1] + n, dist(a[i + 1] + n, a[i] + n)});
    //     adj[a[i + 1] + n].push_back({a[i] + n, dist(a[i + 1] + n, a[i] + n)});
    // }

    // adj[a[m - 1]].push_back({a[0] + n, dist(a[m - 1], a[0] + n)});
    // adj[a[0] + n].push_back({a[m - 1], dist(a[m - 1], a[0] + n)});
    // adj[a[0]].push_back({a[m - 1] + n, dist(a[0], a[m - 1] + n)});
    // adj[a[m - 1] + n].push_back({a[0], dist(a[0], a[m - 1] + n)});

    vector<pll> qu(q);
    for (ll i = 0; i < q; i++) {
        cin >> qu[i].first >> qu[i].second;
        d[qu[i].first] = d[qu[i].second] = inf;
        // if (adj.find(u) == adj.end()) {
        //     auto it = adj.lower_bound(u);
        //     ll w = it -> first, w2;
        //     if (it != adj.begin()) w2 = (--it) -> first;
        //     else w2 = (--adj.end()) -> first;

        //     adj[u].push_back({w, dist(u, w)});
        //     adj[w].push_back({u, dist(u, w)});


        //     adj[w2].push_back({u, dist(u, w2)});
        //     adj[u].push_back({w2, dist(u, w2)});
        // }

        // if (adj.find(v) == adj.end()) {
        //     auto it = adj.lower_bound(v);
        //     ll w, w2;
        //     if (it == adj.end()) w = adj.begin() -> first;
        //     else w = it -> first;

        //     if (it != adj.begin()) w2 = (--it) -> first;
        //     else w2 = (--adj.end()) -> first;

        //     adj[v].push_back({w, dist(v, w)});
        //     adj[w].push_back({v, dist(v, w)});


        //     adj[v].push_back({w2, dist(v, w2)});
        //     adj[w2].push_back({v, dist(v, w2)});
        // }

        // cout << d(u, v, adj) << "\n";
    }

    priority_queue<pll, vector<pll>, greater<>> pq;

    pq.push({0, 0});
    d[0] = 0;

    while (pq.size()) {
        auto [t, u] = pq.top();
        pq.pop();
        if (t != d[u]) continue;

        // neighbour fouq
        auto it = d.upper_bound(u);
        ll v;
        if (it == d.end()) v = d.begin() -> first;
        else v = it -> first;
        if (d[u] + dist(u, v) < d[v]) {
            d[v] = d[u] + dist(u, v);
            pq.push({d[v], v});
        }

        // neighbour lte7t
        it = d.lower_bound(u);
        if (it == d.begin()) v = (--d.end()) -> first;
        else v = (--it) -> first;
                if (d[u] + dist(u, v) < d[v]) {
            d[v] = d[u] + dist(u, v);
            pq.push({d[v], v});
        }
        
        // friend
        if (has[u]) {
            v = (u + n) % (2 * n);
            if (d[u] + 1 < d[v]) {
                d[v] = d[u] + 1;
                pq.push({d[v], v});
            }
        }
    }

    for (auto [u, v] : qu) {
        cout << d[v] << "\n";
    }

    return 0;
}
#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...