제출 #1267747

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

const int MAXN = 1e5 + 10;
const int MAXQ = 5e4 + 10;

vector<int> adj[MAXN];

int dist[MAXN], marc[MAXN];

int n, k; 

vector<pair<int, int>> pre[MAXN], nxt[MAXN];

void bfs(int x){

  set<int> s;

  for(int i=1; i<=n; i++){
    dist[i] = 1e9;
    marc[i] = 0;
    s.insert(i);
  }

  queue<int> q;

  marc[x] = 1;
  dist[x] = 0;

  q.push(x);
  s.erase(x);

  while(!q.empty()){

    int v = q.front();
    q.pop();

    for(auto u : adj[v]){

      vector<int> to_erase;

      if(v < u){

        auto w = s.upper_bound(v);

        while(w != s.end() && *w <= u){

          dist[*w] = dist[v] + 1;
          marc[*w] = 1;

          q.push(*w);
          
          to_erase.push_back(*w);
          ++ w;

        } 

      } else{

        auto w = s.lower_bound(u);

        while(w != s.end() && *w < v){

          dist[*w] = dist[v] + 1;
          marc[*w] = 1;

          q.push(*w);

          to_erase.push_back(*w);
          ++ w;

        }

      }

      for(auto x : to_erase) s.erase(x);


    }

  }

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  cin >> n >> k;

  int cur = n;

  int m; cin >> m;

  while(m--){

    int a, b; cin >> a >> b;

    if(a < b){

      nxt[a].push_back({b, 1});
      nxt[min(b + 1, a + k)].push_back({b, -1});

    } else{

      pre[a].push_back({b, 1});
      pre[max(b - 1, a - k)].push_back({b, -1});

    }
    
  }

  multiset<int> ms;

  for(int i=1; i<=n; i++){

    for(auto j : nxt[i]){
      if(j.second == -1){
        ms.erase(ms.find(j.first));
      } else ms.insert(j.first);
    }

    if(!ms.empty()) adj[i].push_back(*ms.rbegin());

  }

  ms.clear();

  for(int i=n; i>=1; i--){

    for(auto j : pre[i]){
      if(j.second == -1){
        ms.erase(ms.find(j.first));
      } else ms.insert(j.first);
    }

    if(!ms.empty()) adj[i].push_back(*ms.begin());

  }

  /*for(int i=1; i<=n; i++){
    cout << i << ": ";
    for(auto j : adj[i]) cout << j << " ";
    cout << "\n";
  }*/

  int q; cin >> q;

  while(q--){
    int a, b; cin >> a >> b;
    bfs(a);
    cout << (marc[b] ? dist[b] : -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...