제출 #1086691

#제출 시각아이디문제언어결과실행 시간메모리
1086691daoquanglinh2007Passport (JOI23_passport)C++17
6 / 100
518 ms77608 KiB
#include <bits/stdc++.h>
using namespace std;

#define pii pair <int, int>
#define fi first
#define se second
#define mp make_pair

const int NM = 2e5, inf = 1e9+7;

int N, Q, L[NM+5], R[NM+5];
vector <pii> adj[4*NM+5];
int dist[2][4*NM+5];
priority_queue <pii, vector <pii>, greater <pii> > pq;
int res[4*NM+5];

void update(int id, int l, int r, int u, int v, int x){
    if (v < l || u > r) return;
    if (l >= u && r <= v){
        if (l == r){
            adj[l].push_back(mp(x, 1));
        }
        else{
            adj[N+id].push_back(mp(x, 1));
        }
        return;
    }
    int mid = (l+r)/2;
    update(2*id, l, mid, u, v, x);
    update(2*id+1, mid+1, r, u, v, x);
}

void solve(int id, int l, int r){
    if (l == r) return;
    int mid = (l+r)/2;
    solve(2*id, l, mid);
    solve(2*id+1, mid+1, r);
    adj[(l < mid ? N+2*id : l)].push_back(mp(N+id, 0));
    adj[(mid+1 < r ? N+2*id+1 : r)].push_back(mp(N+id, 0));
}

void binary_bfs(int s, int dist[NM+5]){
    for (int i = 1; i <= 4*N; i++) dist[i] = +inf;
    dist[s] = 0;
    pq.push(mp(0, s));
    while (!pq.empty()){
        int u = pq.top().se;
        if (dist[u] != pq.top().fi){
            pq.pop();
            continue;
        }
        pq.pop();
        for (pii p : adj[u]){
            int v = p.fi, w = p.se;
            if (dist[u]+w >= dist[v]) continue;
            dist[v] = dist[u]+w;
            pq.push(mp(dist[v], v));
        }
    }
}

void dijkstra(){
    for (int i = 1; i <= 4*N; i++){
        res[i] = min(dist[0][i]+dist[1][i], +inf);
        pq.push(mp(res[i], i));
    }
    while (!pq.empty()){
        int u = pq.top().se;
        if (res[u] != pq.top().fi){
            pq.pop();
            continue;
        }
        pq.pop();
        for (pii p : adj[u]){
            int v = p.fi, w = p.se;
            if (res[u]+w >= res[v]) continue;
            res[v] = res[u]+w;
            pq.push(mp(res[v], v));
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> N;
    for (int i = 1; i <= N; i++){
        cin >> L[i] >> R[i];
        update(1, 1, N, L[i], R[i], i);
    }
    solve(1, 1, N);
    binary_bfs(1, dist[0]);
    binary_bfs(N, dist[1]);
    dijkstra();
    cin >> Q;
    while (Q--){
        int X; cin >> X;
        if (res[X] == +inf) cout << -1; else cout << res[X];
        cout << '\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...