제출 #1164159

#제출 시각아이디문제언어결과실행 시간메모리
1164159fryingducPassport (JOI23_passport)C++20
100 / 100
736 ms86312 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 8e5 + 5;

vector<pair<int, int>> g[maxn];
int n, q;
int a[maxn], b[maxn];
int rv[maxn], sl[maxn], sr[maxn];
int cd[2][maxn];
long long d[maxn];
int mx_nodes;

void add_edge(int u, int v, int w) {
  g[u].emplace_back(v, w);
}

void build(int ind = 1, int l = 1, int r = n) {
  sl[ind] = l, sr[ind] = r;
  mx_nodes = max(mx_nodes, ind);
  if (l == r) {
    rv[l] = ind;
    return;
  }
  int mid = (l + r) >> 1;
  build(ind << 1, l, mid);
  build(ind << 1 | 1, mid + 1, r);
  add_edge(ind << 1, ind, 0);
  add_edge(ind << 1 | 1, ind, 0);
}

void update(int pos, int x, int y, int ind = 1, int l = 1, int r = n) {
  if (l > y || r < x) return;
  if (x <= l and r <= y) {
    add_edge(ind, rv[pos], 1);
    return;
  }
  int mid = (l + r) >> 1;
  update(pos, x, y, ind << 1, l, mid);
  update(pos, x, y, ind << 1 | 1, mid + 1, r);
}

void bfs(int d[], int src) {
  for (int i = 1; i <= mx_nodes; ++i) {
    d[i] = 1e9;
  }
  deque<pair<int, int>> dq;
  dq.emplace_back(0, src);
  d[src] = 0;
  while (!dq.empty()) {
    auto [dist, u] = dq.front();
    dq.pop_front();
    if (d[u] < dist) continue;
    for (auto [v, w] : g[u]) {
      if (d[v] > d[u] + w) {
        d[v] = d[u] + w;
        if (w == 1) dq.emplace_back(d[v], v);
        else dq.push_front(make_pair(d[v], v));
      }
    }
  }
}

void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i] >> b[i];
  }
  build();
  for (int i = 1; i <= n; ++i) {
    update(i, a[i], b[i]);
  }
  bfs(cd[0], rv[1]);
  bfs(cd[1], rv[n]);
  using T = pair<long long, int>;
  priority_queue<T, vector<T>, greater<T>> pq;
  for (int i = 1; i <= mx_nodes; ++i) {
    d[i] = cd[0][i] + cd[1][i];
    if (d[i] < 1e9) {
      if (sl[i] == sr[i]) {
        if (sl[i] > 1 and sr[i] < n) --d[i];
        pq.emplace(d[i], i);
      }
    }
  }
  while (!pq.empty()) {
    auto [dist, u] = pq.top();
    pq.pop();
    if (d[u] < dist) continue;
    for (auto [v, w] : g[u]) {
      if (d[v] > d[u] + w) {
        pq.emplace(d[v] = d[u] + w, v);
      }
    }
  }
  cin >> q;
  while (q--) {
    int u; cin >> u;
    cout << (d[rv[u]] >= 1e9 ? -1 : d[rv[u]]) << '\n';
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

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