제출 #1242951

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

using pii = pair<int, int>;

#define X first
#define Y second
#define lc id<<1
#define rc lc|1
#define mid ((l+r)>>1)

const int MXN = 2e5+5, inf=1e7;

int n, L[MXN], R[MXN], N;
vector<pii> g[MXN*3];

int dis[2][MXN*3], val[MXN];

void bfs(int id, int v) {
    fill(dis[id]+1, dis[id]+N+1, inf);
    deque<int> q;
    dis[id][v] = 0;
    q.push_back(v);
    while(!q.empty()) {
        int v = q.front();
        q.pop_front();
        for(auto [u, w] : g[v])
            if(dis[id][u]>dis[id][v]+w) {
                dis[id][u] = dis[id][v]+w;
                if(w) q.push_back(u);
                else q.push_front(u);
            }
    }
}

int D[MXN*3];

void SP() {
    vector<int> vec(n);
    iota(vec.begin(), vec.end(), 1);
    sort(vec.begin(), vec.end(), [&](int u, int v) {
        return val[u] > val[v];
    });
    fill(D+1, D+N+1, inf);
    deque<int> q;
    while(!q.empty() || !vec.empty()) {
        if(q.empty())
            while(!vec.empty()) {
                int dd = val[vec.back()];
                if(dd<D[vec.back()]) {
                    D[vec.back()] = dd;
                    q.push_back(vec.back());
                    vec.pop_back();
                    break;
                }
                vec.pop_back();
            }
        if(q.empty()) break;
        while(!vec.empty()) {
            int dd = val[vec.back()];
            if(dd<D[vec.back()] && dd<=D[q.front()]+1) {
                D[vec.back()] = dd;
                q.push_back(vec.back());
                vec.pop_back();
            }
            else break;
        }
        int v = q.front();
        q.pop_front();
        for(auto [u, w] : g[v])
            if(D[u]>D[v]+w) {
                D[u] = D[v]+w;
                if(w) q.push_back(u);
                else q.push_front(u);
            }
    }
}

int name[MXN<<2], mn[2][MXN<<2];

int build(int l=1, int r=n+1, int id=1) {
    if(r-l == 1) return name[id] = l;
    name[id] = ++N;
    g[build(l, mid, lc)].push_back({name[id], 0});
    g[build(mid, r, rc)].push_back({name[id], 0});
    return name[id];
}

void build2(int l=1, int r=n+1, int id=1) {
    if(r-l == 1) {
        mn[0][id] = dis[0][l];
        mn[1][id] = dis[1][l];
        return;
    }
    build2(l, mid, lc);
    build2(mid, r, rc);
    mn[0][id] = min(mn[0][lc], mn[0][rc]);
    mn[1][id] = min(mn[1][lc], mn[1][rc]);
}

void add(int s, int e, int v, int l=1, int r=n+1, int id=1) {
    if(s>=r || l>=e) return;
    if(s<=l && r<=e) {
        g[name[id]].push_back({v, 1});
        return;
    }
    add(s, e, v, l, mid, lc);
    add(s, e, v, mid, r, rc);
}

inline pii min_(pii x, pii y) {
    return pii(min(x.X, y.X), min(x.Y, y.Y));
}

pii get(int s, int e, int l=1, int r=n+1, int id=1) {
    if(s>=r || l>=e) return {inf, inf};
    if(s<=l && r<=e) return {mn[0][id], mn[1][id]};
    return min_(get(s, e, l, mid, lc), get(s, e, mid, r, rc));
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n;
    N = n;
    build();
    for(int i=1; i<=n; i++) {
        cin >> L[i] >> R[i];
        add(L[i], R[i]+1, i);
    }
    bfs(0, 1);
    bfs(1, n);
    build2();
    for(int i=1; i<=n; i++) {
        pii x = get(L[i], R[i]+1);
        val[i] = x.X+x.Y+1;
    }
    SP();
    int q;
    cin >> q;
    while(q--) {
        int x;
        cin >> x;
        cout << (D[x]>=inf ? -1 : D[x]) << '\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...