Submission #1308222

#TimeUsernameProblemLanguageResultExecution timeMemory
1308222viobowPassport (JOI23_passport)C++17
100 / 100
941 ms148052 KiB
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define re exit(0);
#define FOR(i, a, b)   for(int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, a, b)  for(int i = (a), _b = (b); i >= _b; i--)
#define LOOP(a)        for(int i = 0, _a = (a); i < _a; i++)
#define left id<<1
#define right id<<1|1
#define _lower(v, x) lower_bound(v.begin(), v.end(), x) - v.begin() + 1

using namespace std;

typedef vector<int> vi;
typedef pair<int, int> pii;
typedef vector<pii> vii;

template<typename T> void chkmin(T &x, T y) {if (y < x) x = y;}
template<typename T> void chkmax(T &x, T y) {if (y > x) x = y;}

const int mod = 1e9 + 7;
void add(int &a, int b) {
    a += b;
    if (a >= mod) a -= mod;
    if (a < 0) a += mod;
}

int _pow(int a, int b) {
   int ans = 1;
   while (b) {
   if (b % 2 == 1) ans = 1ll * ans * a % mod;
        a = 1ll * a * a % mod;
        b /= 2;
   }
   return ans;
}

//--------------------------------------------------------------------------------------------------------------------------------------

const int INF = 1e15 + 7;
const int maxn = 2e5;

struct state {
    int pos, cost;
    bool operator< (const state &other) const {
        return cost > other.cost;
    }
};

int L[maxn + 5], R[maxn + 5], X[maxn + 5];
vii adjList[4 * maxn + 5];
int virtual_id[maxn + 5]; bool isLeaf[4 * maxn + 5];
int n, numQuery;

void build_virtual_id(int id, int l, int r) {
    if (l == r) {
        virtual_id[l] = id;
        isLeaf[id] = 1;
        return;
    }
    int mid = (l + r) >> 1;
    build_virtual_id(left, l, mid);
    build_virtual_id(right, mid + 1, r);
    adjList[left].pb({id, 0});
    adjList[right].pb({id, 0});
}

void make_edge(int id, int l, int r, int u, int v, int source) {
    if (r < u || l > v) return;
    if (u <= l && r <= v) {
        adjList[id].pb({source, 1});
        return;
    }
    int mid = (l + r) >> 1;
    make_edge(left, l, mid, u, v, source);
    make_edge(right, mid + 1, r, u, v, source);
}

vector<int> uwu(vector<int> init_dist) {
    vector<int> d = init_dist;
    priority_queue<state> Q;

    for (int i = 1; i < (int)d.size(); i++) {
        if (d[i] != INF) Q.push({i, d[i]});
    }

    while (Q.size()) {
        auto top = Q.top(); Q.pop();
        int u = top.pos;
        if (d[u] < top.cost) continue;

        for (auto [v, w] : adjList[u]) {
            if (d[v] > d[u] + w) {
                Q.push({v, d[v] = d[u] + w});
            }
        }
    }

    return d;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    //#define name "mooo"
    //if (fopen(name".inp", "r")) {
    //    freopen(name".inp", "r", stdin);
    //    freopen(name".out", "w", stdout);
    //}

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> L[i] >> R[i];

    cin >> numQuery;
    for (int i = 1; i <= numQuery; i++)
        cin >> X[i];

    build_virtual_id(1, 1, n);
    for (int i = 1; i <= n; i++)
        make_edge(1, 1, n, L[i], R[i], virtual_id[i]);

    vector<int> init_dist(4 * maxn + 5, INF);
    init_dist[virtual_id[1]] = 0;
    vector<int> d1 = uwu(init_dist);
    d1[virtual_id[1]] = 1;

    init_dist.assign(4 * maxn + 5, INF);
    init_dist[virtual_id[n]] = 0;
    vector<int> dn = uwu(init_dist);
    dn[virtual_id[n]] = 1;

    init_dist.assign(4 * maxn + 5, INF);
    for (int i = 1; i <= n; i++) {
        int u = virtual_id[i];
        if (d1[u] == INF || dn[u] == INF) init_dist[u] = INF;
        else init_dist[u] = d1[u] + dn[u] - 1;
    }
    vector<int> d = uwu(init_dist);

    for (int i = 1; i <= numQuery; i++) {
        int res = d[virtual_id[X[i]]];
        if (res == INF) res = -1;
        cout << res << '\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...