Submission #1176253

#TimeUsernameProblemLanguageResultExecution timeMemory
1176253VMaksimoski008Passport (JOI23_passport)C++17
100 / 100
997 ms94292 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int maxn = 2e5 + 5; int n, L[maxn], R[maxn], id[maxn], D[4*maxn][3]; vector<pii> G[4*maxn]; void build(int u, int tl, int tr) { if(tl == tr) { id[tl] = u; } else { int tm = (tl + tr) / 2; build(2*u, tl, tm); build(2*u+1, tm+1, tr); G[2*u].push_back({ u, 0 }); G[2*u+1].push_back({ u, 0 }); } } void add(int u, int tl, int tr, int s) { if(L[s] > tr || tl > R[s]) return ; if(L[s] <= tl && tr <= R[s]) { G[u].push_back({ id[s], 1 }); return ; } int tm = (tl + tr) / 2; add(2*u, tl, tm, s); add(2*u+1, tm+1, tr, s); } void bfs(int t, int s) { priority_queue<pii, vector<pii>, greater<> > pq; for(int i=1; i<=4*n; i++) pq.push({ D[i][t], i }); while(!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if(D[u][t] != d) continue; for(auto [v, w] : G[u]) if(D[v][t] > d + w) pq.push({ D[v][t] = d + w, v }); } } signed main() { cin >> n; build(1, 1, n); for(int j=0; j<3; j++) for(int i=1; i<=4*n; i++) D[i][j] = 1e6; for(int i=1; i<=n; i++) { cin >> L[i] >> R[i]; if(L[i] == 1) D[id[i]][0] = 0; if(R[i] == n) D[id[i]][1] = 0; add(1, 1, n, i); } bfs(0, 1); bfs(1, n); for(int i=1; i<=n; i++) D[id[i]][2] = D[id[i]][0] + D[id[i]][1] + 1; bfs(2, n); int q; cin >> q; while(q--) { int x; cin >> x; cout << (D[id[x]][2] < 1e6 ? D[id[x]][2] : -1) << '\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...