Submission #1086697

#TimeUsernameProblemLanguageResultExecution timeMemory
1086697daoquanglinh2007Passport (JOI23_passport)C++17
100 / 100
543 ms84364 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];
deque <int> dq;
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;
    dq.push_back(s);
    while (!dq.empty()){
        int u = dq.front();
        dq.pop_front();
        for (pii p : adj[u]){
            int v = p.fi, w = p.se;
            if (dist[u]+w >= dist[v]) continue;
            dist[v] = dist[u]+w;
            if (w == 0) dq.push_front(v);
            else dq.push_back(v);
        }
    }
}
 
void dijkstra(){
    for (int i = 1; i <= 4*N; i++){
        res[i] = min(dist[0][i]+dist[1][i]-(i > 1 && i < N), +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...