Submission #1308139

#TimeUsernameProblemLanguageResultExecution timeMemory
1308139minh30082008Passport (JOI23_passport)C++20
100 / 100
437 ms87280 KiB
#include<bits/stdc++.h> #define fi first #define se second #define FOR(i, k, n) for(int i = k; i <= n; i++) #define FOR1(i, k, n) for(int i = k; i >= n; i--) #define pb push_back #define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define vi vector<int> #define pii pair<int, int> #define vii vector<pii> #define ll long long #define vll vector<ll> #define pll pair<ll, ll> #define re return 0 #define mii map<int, int> #define input "ALONE.inp" #define output "ALONE.out" #define rf freopen(input, "r", stdin); freopen(output, "w", stdout) using namespace std; const int maxn = 2e5 + 5; const int mod = 1e9 + 7; const int base = 998244353; const int base1 = 31; const int SZ = 320; const ll INF = 1e18; void add(int &a, int b) { a += b; if(a >= mod) a -= mod; if(a < 0) a += mod; } mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return uniform_int_distribution<int>(l, r) (rd); } int n, q; int f1[maxn * 5], fn[maxn * 5]; int ans[maxn * 5]; int get_id(int x) { return x + n; } vii adj[maxn * 5]; pii a[maxn]; void build(int id, int l, int r) { if(l == r) { adj[l].pb({get_id(id), 0}); return; } int mid = (l + r) >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); adj[get_id(id * 2)].pb({get_id(id), 0}); adj[get_id(id * 2 + 1)].pb({get_id(id), 0}); } void update(int id, int l, int r, int u, int v, int x) { if(l > v || r < u) return; if(l >= u && r <= v) { adj[get_id(id)].pb({x, 1}); return; } int mid = (l + r) >> 1; update(id * 2, l, mid, u, v, x); update(id * 2 + 1, mid + 1, r, u, v, x); } void BFS(int u, int d[]) { FOR(i, 1, n * 5) d[i] = 1e9; d[u] = 0; deque<int> Q; Q.pb(u); while(!Q.empty()) { u = Q.front(); Q.pop_front(); for(auto x : adj[u]) { int v = x.fi, w = x.se; if(d[v] > d[u] + w) { d[v] = d[u] + w; if(w == 0) Q.push_front(v); else Q.push_back(v); } } } } void Dijkstra() { priority_queue<pii, vii, greater<pii>> Q; FOR(i, 1, n) Q.push({ans[i], i}); FOR(i, n + 1, n * 5) ans[i] = 1e9; while(!Q.empty()) { int W = Q.top().fi, u = Q.top().se; Q.pop(); if(W > ans[u]) continue; for(auto x : adj[u]) { int v = x.fi, w = x.se; if(ans[v] > ans[u] + w) { ans[v] = ans[u] + w; Q.push({ans[v], v}); } } } } int main() { fastio; cin >> n; FOR(i, 1, n) cin >> a[i].fi >> a[i].se; build(1, 1, n); FOR(i, 1, n) update(1, 1, n, a[i].fi, a[i].se, i); BFS(1, f1); BFS(n, fn); FOR(i, 1, n) { ans[i] = f1[i] + fn[i] - (i != 1 && i != n); } Dijkstra(); cin >> q; while(q--) { int u; cin >> u; if(ans[u] > n) cout << "-1\n"; else cout << ans[u] << "\n"; } re; }
#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...