제출 #1361159

#제출 시각아이디문제언어결과실행 시간메모리
1361159gayRailway Trip 2 (JOI22_ho_t4)C++20
16 / 100
2116 ms588132 KiB
#include <bits/stdc++.h>

using namespace std;

using ld = long double;
using ll = long long;

const ll INF = 1e18, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    while (q--) {
        solve();
    }
}


struct sparse_table1 {
    vector<vector<ll>> v;
    vector<ll> a;
    ll n;

    void build(ll n_, vector<ll> &b) {
        v.resize(__lg(n_) + 1, vector<ll>(n_));
        n = n_;
        a = b;
        for (int i = 0; i < n; i++) {
            v[0][i] = a[i];
        }
        for (int j = 1; j <= __lg(n); j++) {
            for (int i = 0; i + (1 << j) <= n; i++) {
                v[j][i] = min(v[j - 1][i], v[j - 1][i + (1 << (j - 1))]);
            }
        }
    }

    ll query(ll l, ll r) {
        ll j = __lg(r - l);
        return min(v[j][l], v[j][r - (1 << j)]);
    }
};

struct sparse_table2 {
    vector<vector<ll>> v;
    vector<ll> a;
    ll n;

    void build(ll n_, vector<ll> &b) {
        v.resize(__lg(n_) + 1, vector<ll>(n_));
        n = n_;
        a = b;
        for (int i = 0; i < n; i++) {
            v[0][i] = a[i];
        }
        for (int j = 1; j <= __lg(n); j++) {
            for (int i = 0; i + (1 << j) <= n; i++) {
                v[j][i] = max(v[j - 1][i], v[j - 1][i + (1 << (j - 1))]);
            }
        }
    }

    ll query(ll l, ll r) {
        ll j = __lg(r - l);
        return max(v[j][l], v[j][r - (1 << j)]);
    }
};

sparse_table2 t1;
sparse_table1 t2;

void solve() {
    ll n, k; cin >> n >> k;
    vector<ll> e1(n, -1), e2(n, n);
    ll m; cin >> m;
    for (int i = 0; i < m; i++) {
        ll a, b; cin >> a >> b;
        a--, b--;
        if (a <= b) {
            e1[a] = max(e1[a], b);
        } else {
            e2[a] = min(e2[a], b);
        }
    }
    t1.build(n, e1);
    t2.build(n, e2);

    map<pair<ll, ll>, ll> used;
    queue<pair<ll, ll>> bfs;
    vector<ll> g;
    vector<pair<ll, ll>> segs;

    for (int i = 0; i < n; i++) {
        used[{i, i}] = (int)used.size();
        bfs.emplace(i, i);
        g.emplace_back();
        segs.emplace_back(i, i);
    }

    while (!empty(bfs)) {
        auto [l, r] = bfs.front();
        bfs.pop();
        ll lf = min(l, t2.query(l, min(n - 1, r + k - 1) + 1));
        ll rf = max(r, t1.query(max(0ll, l - k + 1), r + 1));
        if (used.find({lf, rf}) == used.end()) {
            used[{lf, rf}] = (int)used.size();
            bfs.emplace(lf, rf);
            g.emplace_back();
            segs.emplace_back(lf, rf);
        }
        g[used[{l, r}]] = used[{lf, rf}];
    }

    ll q; cin >> q;
    while (q--) {
        ll s, t; cin >> s >> t;
        s--, t--;
        ll cnt = 0, ans = INF;
        ll v = s;
        while (true) {
            if (segs[v].first <= t && t <= segs[v].second) {
                ans = cnt;
                break;
            }
            if (v == g[v]) break;
            v = g[v];
            cnt++;
        }
        if (ans == INF) cout << -1 << '\n';
        else cout << ans << '\n';
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…