Submission #1192454

#TimeUsernameProblemLanguageResultExecution timeMemory
1192454epicci23Passport (JOI23_passport)C++20
100 / 100
495 ms124984 KiB
#include "bits/stdc++.h" #define int long long #define all(v) v.begin() , v.end() #define sz(a) (int)a.size() using namespace std; const int INF = 1e18; const int N = 4e5 + 5; vector<array<int,2>> v[N]; void _(){ int n; cin >> n; int L[N], R[N]; for(int i = 0; i < n; i++){ cin >> L[i] >> R[i]; --L[i], --R[i]; } for(int i = n - 1; i; --i){ v[i * 2].push_back({i, 0}); v[i * 2 + 1].push_back({i, 0}); } for(int i = 0; i < n; i++){ int l = L[i] + n, r = R[i] + n + 1; for(; l < r; l >>= 1, r >>= 1){ if(l&1) v[l++].push_back({i + n, 1}); if(r&1) v[--r].push_back({i + n, 1}); } } vector<int> dist1(2 * N, INF), distn(2 * N, INF); dist1[n] = 0; priority_queue<array<int,2>,vector<array<int,2>>,greater<>> dq; dq.push({0, n}); while(!dq.empty()){ int c = dq.top()[1]; int d = dq.top()[0]; dq.pop(); if(d > dist1[c]) continue; for(auto [u, w] : v[c]){ if(w == 0 && dist1[c] < dist1[u]){ dist1[u] = dist1[c]; dq.push({dist1[u], u}); } if(w == 1 && dist1[c] + 1 < dist1[u]){ dist1[u] = dist1[c] + 1; dq.push({dist1[u], u}); } } } dist1[n] = 1; distn[2 * n - 1] = 0; dq.push({0, 2 * n - 1}); while(!dq.empty()){ int c = dq.top()[1]; int d = dq.top()[0]; dq.pop(); if(d > distn[c]) continue; for(auto [u, w] : v[c]){ if(w == 0 && distn[c] < distn[u]){ distn[u] = distn[c]; dq.push({distn[u], u}); } if(w == 1 && distn[c] + 1 < distn[u]){ distn[u] = distn[c] + 1; dq.push({distn[u], u}); } } } distn[2 * n - 1] = 1; vector<int> dist1n(2 * N, INF); for(int i = n; i < 2 * n; i++){ dist1n[i] = dist1[i] + distn[i] - 1; dq.push({dist1n[i], i}); } while(!dq.empty()){ int d = dq.top()[0]; int c = dq.top()[1]; dq.pop(); if(d > dist1n[c]) continue; for(auto [u, w] : v[c]){ if(w == 0 && dist1n[c] < dist1n[u]){ dist1n[u] = dist1n[c]; dq.push({dist1n[u], u}); } if(w == 1 && dist1n[c] + 1 < dist1n[u]){ dist1n[u] = dist1n[c] + 1; dq.push({dist1n[u], u}); } } } int q; cin >> q; while(q--){ int c; cin >> c; --c; if(dist1n[c + n] >= INF - 1) cout << -1 << '\n'; else cout << dist1n[c + n] << '\n'; } } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); int tc=1;//cin >> tc; while(tc--) _(); 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...