제출 #1151417

#제출 시각아이디문제언어결과실행 시간메모리
1151417horiseunPassport (JOI23_passport)C++20
48 / 100
1051 ms1114112 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

int n, q;
vector<pair<int, int>> adj[200005];

void dijkstra(int strt, vector<int> &dist) {
  priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
  dist[strt] = 0;
  pq.emplace(0, strt);
  while (!pq.empty()) {
    int cdist = pq.top().first, curr = pq.top().second;
    pq.pop();
    if (cdist > dist[curr]) continue;
    for (auto [x, d] : adj[curr]) {
      if (dist[curr] + d < dist[x]) {
        dist[x] = dist[curr] + d;
        pq.emplace(dist[x], x);
      }
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int l, r; cin >> l >> r;
    for (int j = l; j <= r; j++) {
      if (j == i) continue;
      adj[j].emplace_back(i, 1);
    }
  }
  vector<int> dist1(n + 5, 2e9), distn(n + 5, 2e9);
  dijkstra(1, dist1);
  dijkstra(n, distn);
  for (int i = 1; i <= n; i++) {
    adj[n + 1].emplace_back(i, dist1[i] + distn[i] - (i != 1 && i != n));
  }
  vector<int> dist(n + 5, 2e9);
  dijkstra(n + 1, dist);
  cin >> q;
  while (q--) {
    int x; cin >> x;
    cout << (dist[x] == 2e9 ? -1 : dist[x]) << "\n";
  }
}
#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...