Submission #1267743

#TimeUsernameProblemLanguageResultExecution timeMemory
1267743julia_08Railway Trip 2 (JOI22_ho_t4)C++20
0 / 100
1416 ms589824 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; 

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){

      int cnt = 1;

      int sz = min(b - a + 1, k);

      while(cnt <= sz){
        adj[a].push_back(b);
        a ++;
        cnt ++;
      }

    } else{

      int cnt = 1;

      int sz = min(a - b + 1, k);

      while(cnt <= sz){
        adj[a].push_back(b);
        a --;
        cnt ++;
      }

    }
    
  }

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

    if(adj[i].size() <= 2) continue;

    swap(adj[i].back(), adj[i][1]);

    while(adj[i].size() > 2) adj[i].pop_back();

  }

  /*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...