Submission #1308134

#TimeUsernameProblemLanguageResultExecution timeMemory
1308134duongquanghai08Passport (JOI23_passport)C++20
100 / 100
482 ms84128 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200005; const int INF = 1e9 + 7; int n, q; int L[N], R[N]; vector<pair<int, int>> adj[6 * N]; int distL[6 * N], distR[6 * N], distAns[6 * N]; int node_cnt; void build(int id, int l, int r) { node_cnt = max(node_cnt, id + n); if (l == r) { adj[l].push_back({id + n, 0}); return; } int mid = (l + r) >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); adj[id * 2 + n].push_back({id + n, 0}); adj[id * 2 + 1 + n].push_back({id + n, 0}); } void add(int id, int l, int r, int u, int v, int city) { if (l > v || r < u) return; if (l >= u && r <= v) { adj[id + n].push_back({city, 1}); return; } int mid = (l + r) >> 1; add(id * 2, l, mid, u, v, city); add(id * 2 + 1, mid + 1, r, u, v, city); } void bfs(int* d, vector<int>& src, int val) { fill(d, d + node_cnt + 1, INF); deque<int> dq; for (int u : src) { d[u] = val; dq.push_back(u); } while (!dq.empty()) { int u = dq.front(); dq.pop_front(); for (auto& edge : adj[u]) { int v = edge.first; int w = edge.second; if (d[v] > d[u] + w) { d[v] = d[u] + w; if (w == 0) dq.push_front(v); else dq.push_back(v); } } } } void solve_ans() { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; for (int i = 1; i <= node_cnt; i++) { if (distAns[i] < INF) pq.push({distAns[i], i}); } while (!pq.empty()) { int d = pq.top().first; int u = pq.top().second; pq.pop(); if (d > distAns[u]) continue; for (auto& edge : adj[u]) { int v = edge.first; int w = edge.second; if (distAns[v] > d + w) { distAns[v] = d + w; pq.push({distAns[v], v}); } } } } void Solve() { cin >> n; node_cnt = n; build(1, 1, n); for (int i = 1; i <= n; i++) { cin >> L[i] >> R[i]; add(1, 1, n, L[i], R[i], i); } vector<int> srcL, srcR; for (int i = 1; i <= n; i++) { if (L[i] == 1) srcL.push_back(i); if (R[i] == n) srcR.push_back(i); } bfs(distL, srcL, 1); bfs(distR, srcR, 1); for (int i = 1; i <= node_cnt; i++) distAns[i] = INF; for (int i = 1; i <= n; i++) { if (distL[i] < INF && distR[i] < INF) { distAns[i] = distL[i] + distR[i] - 1; } } solve_ans(); cin >> q; while (q--) { int x; cin >> x; if (distAns[x] >= INF) cout << -1 << "\n"; else cout << distAns[x] << "\n"; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen("Passport.inp", "r", stdin); // freopen("Passport.out", "w", stdout); 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...