제출 #1261147

#제출 시각아이디문제언어결과실행 시간메모리
1261147inkvizytorPassport (JOI23_passport)C++20
22 / 100
525 ms118104 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const ll INF = (1LL<<60);

void add(int v, int L, int R,
         vector<vector<pair<ll,int>>> &g,
         int a, int b, int x) {
    if (a <= L && R <= b) {
        g[v].push_back({1, x});
        return;
    }
    if (b < L || R < a) return;
    int mid = (L + R) >> 1;
    add(v<<1,     L,     mid, g, a, b, x);
    add(v<<1|1, mid+1,     R, g, a, b, x);
}

void dijkstra(int s,
              const vector<vector<pair<ll,int>>> &g,
              vector<ll> &dist) {
    fill(dist.begin(), dist.end(), INF);
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
    dist[s] = 0;
    pq.push({0, s});
    while (!pq.empty()) {
        auto [d, v] = pq.top(); pq.pop();
        if (d != dist[v]) continue;
        for (auto [w, u] : g[v]) {
            if (dist[u] > d + w) {
                dist[u] = d + w;
                pq.push({dist[u], u});
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    if (!(cin >> n)) return 0;
    vector<pair<int,int>> p(n);
    for (int i = 0; i < n; i++) {
        cin >> p[i].first >> p[i].second;
        --p[i].first;
        --p[i].second;
    }

    const int N     = 1 << 18;
    const int AGG   = 2 * N;
    const int SRC_L = 2 * N + 1;
    const int SRC_R = 2 * N + 2;
    const int GSZ   = SRC_R + 1;

    vector<vector<pair<ll,int>>> g(GSZ);
    for (int i = 1; i < N; i++) {
        g[i<<1].push_back({0, i});
        g[i<<1|1].push_back({0, i});
    }
    for (int i = 0; i < n; i++) {
        if (p[i].first == 0)     g[SRC_L].push_back({0, N + i});
        if (p[i].second == n-1)  g[SRC_R].push_back({0, N + i});
        add(1, 0, N-1, g, p[i].first, p[i].second, N + i);
    }
    vector<ll> distL(GSZ), distR(GSZ), dist(GSZ);
    dijkstra(SRC_L, g, distL);
    dijkstra(SRC_R, g, distR);
    for (int i = 0; i < 2 * N; i++) {
        if (distL[i] >= INF/2 || distR[i] >= INF/2) continue;
        g[AGG].push_back({distL[i] + distR[i], i});
    }

    dijkstra(AGG, g, dist);

    int q; cin >> q;
    while (q--) {
        int x; cin >> x; --x;
        ll ans = dist[N + x];
        if (ans >= INF/2) cout << -1 << '\n';
        else              cout << ans + 1 << '\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...