Submission #1086695

#TimeUsernameProblemLanguageResultExecution timeMemory
1086695daoquanglinh2007Passport (JOI23_passport)C++17
100 / 100
574 ms84248 KiB
#include <bits/stdc++.h> using namespace std; #define pii pair <int, int> #define fi first #define se second #define mp make_pair const int NM = 2e5, inf = 1e9+7; int N, Q, L[NM+5], R[NM+5]; vector <pii> adj[4*NM+5]; int dist[2][4*NM+5]; priority_queue <pii, vector <pii>, greater <pii> > pq; int res[4*NM+5]; void update(int id, int l, int r, int u, int v, int x){ if (v < l || u > r) return; if (l >= u && r <= v){ if (l == r){ adj[l].push_back(mp(x, 1)); } else{ adj[N+id].push_back(mp(x, 1)); } return; } int mid = (l+r)/2; update(2*id, l, mid, u, v, x); update(2*id+1, mid+1, r, u, v, x); } void solve(int id, int l, int r){ if (l == r) return; int mid = (l+r)/2; solve(2*id, l, mid); solve(2*id+1, mid+1, r); adj[(l < mid ? N+2*id : l)].push_back(mp(N+id, 0)); adj[(mid+1 < r ? N+2*id+1 : r)].push_back(mp(N+id, 0)); } void binary_bfs(int s, int dist[NM+5]){ for (int i = 1; i <= 4*N; i++) dist[i] = +inf; dist[s] = 0; pq.push(mp(0, s)); while (!pq.empty()){ int u = pq.top().se; if (dist[u] != pq.top().fi){ pq.pop(); continue; } pq.pop(); for (pii p : adj[u]){ int v = p.fi, w = p.se; if (dist[u]+w >= dist[v]) continue; dist[v] = dist[u]+w; pq.push(mp(dist[v], v)); } } } void dijkstra(){ for (int i = 1; i <= 4*N; i++){ res[i] = min(dist[0][i]+dist[1][i]-(i > 1 && i < N), +inf); pq.push(mp(res[i], i)); } while (!pq.empty()){ int u = pq.top().se; if (res[u] != pq.top().fi){ pq.pop(); continue; } pq.pop(); for (pii p : adj[u]){ int v = p.fi, w = p.se; if (res[u]+w >= res[v]) continue; res[v] = res[u]+w; pq.push(mp(res[v], v)); } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N; for (int i = 1; i <= N; i++){ cin >> L[i] >> R[i]; update(1, 1, N, L[i], R[i], i); } solve(1, 1, N); binary_bfs(1, dist[0]); binary_bfs(N, dist[1]); dijkstra(); cin >> Q; while (Q--){ int X; cin >> X; if (res[X] == +inf) cout << -1; else cout << res[X]; cout << '\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...