제출 #1267788

#제출 시각아이디문제언어결과실행 시간메모리
1267788gustavo_dRailway Trip 2 (JOI22_ho_t4)C++20
0 / 100
715 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5;

vector<int> adj[MAXN];
int dist[MAXN];
int l[MAXN], r[MAXN];
bool vis[MAXN];
vector<int> updL[MAXN], updR[MAXN];

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    int n, k; cin >> n >> k;
    int m; cin >> m;
    for (int i=0; i<m; i++) {
        int a, b; cin >> a >> b; a--; b--;
        if (a <= b) {
            // r[a...min(b, a+k-1)] = max(b)
            // cout << "r: " << a << ' ' << min(b, a+k-1) << '=' << b << endl;
            updR[a].push_back(b);
            updR[min(b, a+k-1)].push_back(-b);
        } else {
            // l[max(b, a-k+1)...a] = min(a)
            // cout << "l: " << max(b, a-k+1) << ' ' << a << '=' << b << endl;
            updL[max(b, a-k+1)].push_back(b);
            updL[a].push_back(-b);
        }
    }
    multiset<int> pfL, pfR;
    for (int i=0; i<n; i++) {
        for (int x : updL[i]) {
            if (x < 0) continue;
            pfL.insert(x);
        }
        for (int x : updR[i]) {
            if (x < 0) continue;
            pfR.insert(x);
        }

        l[i] = (pfL.empty() ? i : *pfL.begin());
        r[i] = (pfR.empty() ? i : *pfR.rbegin());

        for (int x : updL[i]) {
            if (x > 0) continue;
            pfL.erase(pfL.find(-x));
        }
        for (int x : updR[i]) {
            if (x > 0) continue;
            pfR.erase(pfR.find(-x));
        }
    }

    for (int i=0; i<n; i++) {
        // cout << l[i] << ' ' << r[i] << endl;
        for (int j=l[i]; j<=r[i]; j++) {
            adj[i].push_back(j);
        }
    }

    int qs; cin >> qs;
    for (int q=0; q<qs; q++) {
        int src, dest; cin >> src >> dest;
        src--; dest--;
        if (src == dest) {
            cout << 0 << endl;
            continue;
        }
        dist[src] = 1;
        queue<int> visit;
        for (int i=0; i<n; i++) vis[i] = false;
        vis[src] = true;
        bool found = false; visit.push(src);
        while (!visit.empty()) {
            int v = visit.front();
            visit.pop();
            // cout << v << endl;
            if (l[v] <= dest and dest <= r[v]) {
                cout << dist[v] << '\n';
                found = true;
                break;
            }
            for (int viz : adj[v]) {
                if (vis[viz]) continue;
                visit.push(viz);
                vis[viz] = true;
                dist[viz] = dist[v] + 1;
            }
        }
        if (!found) cout << -1 << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...