제출 #1261149

#제출 시각아이디문제언어결과실행 시간메모리
1261149niepamietamhaslaPassport (JOI23_passport)C++20
100 / 100
419 ms42840 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pii pair<int,int> const int MAXN = 2e5 + 5; pii range[MAXN]; int used[MAXN]; int minod1[MAXN]; int minodn[MAXN]; int ans[MAXN]; const int base = 1 << 18; vector<int> drzew[base << 1]; void dodaj(int w, int a, int b, int akt_a, int akt_b, int ind){ if(a <= akt_a and akt_b <= b){ drzew[w].push_back(ind); return; } if(akt_a > b or akt_b < a) return; int mid = (akt_a + akt_b) / 2; dodaj(2 * w, a, b, akt_a, mid, ind); dodaj(2 * w + 1, a, b, mid + 1, akt_b, ind); return; } void preptree(int n){ for(int i = 1; i < 2 * base; ++i){ drzew[i].clear(); } for(int i = 1; i <= n; ++i){ used[i] = 0; dodaj(1, range[i].first, range[i].second, 1, base, i); } return; } struct comp{ bool operator()(const pii &p1, const pii &p2){ if(p1.second != p2.second) return p1.second > p2.second; return false; } }; queue<pii> que; priority_queue<pii, vector<pii>, comp> pq; void dodajnad(int w, int koszt, int typ){ w += base - 1; while(w != 0){ for(auto u : drzew[w]){ if(used[u] == 1) continue; used[u] = 1; if(typ == 1) que.push({u, koszt + 1}); else pq.push((pii){u, koszt + 1}); } drzew[w].clear(); w /= 2; } return; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; int a, b; for(int i = 1; i <= n; ++i){ cin >> a >> b; range[i] = {a, b}; minod1[i] = minodn[i] = 1e9; ans[i] = 1e9; } preptree(n); que.push({1, 0}); while(!que.empty()){ auto e = que.front(); que.pop(); if(minod1[e.first] != 1e9) continue; minod1[e.first] = e.second; dodajnad(e.first, e.second, 1); } preptree(n); que.push({n, 0}); while(!que.empty()){ auto e = que.front(); que.pop(); if(minodn[e.first] != 1e9) continue; minodn[e.first] = e.second; dodajnad(e.first, e.second, 1); } preptree(n); for(int i = 1; i <= n; ++i){ pq.push((pii){i, minod1[i] + minodn[i] - 1 * (i != 1 and i != n ? 1 : 0)}); } while(!pq.empty()){ auto e = pq.top(); pq.pop(); if(ans[e.first] != 1e9) continue; ans[e.first] = e.second; dodajnad(e.first, e.second, 2); } int q; cin >> q; for(int i = 0; i < q; ++i){ cin >> a; if(ans[a] < 1e9) cout << ans[a] << "\n"; else cout << -1 << "\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...