Submission #1280017

#TimeUsernameProblemLanguageResultExecution timeMemory
1280017IcelastPassport (JOI23_passport)C++20
100 / 100
639 ms127048 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 1e9+9; vector<int> bfs01(int n, int s, vector<vector<pair<int, int>>> adj){ vector<int> d(n+1, INF); deque<int> dq; d[s] = 0; dq.push_front(s); while(!dq.empty()){ int u = dq.front(); dq.pop_front(); for(auto it : adj[u]){ int v = it.first, w = it.second; if(d[u] + w < d[v]){ d[v] = d[u] + w; if(w == 0){ dq.push_front(v); }else{ dq.push_back(v); } } } } return d; } vector<int> dijkstra(int n, vector<int> dist, vector<vector<pair<int, int>>> &adj){ vector<bool> vis(n+1, false); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; for(int i = 1; i <= n; i++){ if(dist[i] != INF){ pq.push({dist[i], i}); } } while(!pq.empty()){ int d_u = pq.top().first; int u = pq.top().second; pq.pop(); if(vis[u]){ continue; } vis[u] = true; for(auto it : adj[u]){ int v = it.first; int w = it.second; if(vis[v]) continue; if(dist[v] > d_u+w){ dist[v] = d_u+w; pq.push({dist[v], v}); } } } return dist; } void solve(){ int n; cin >> n; vector<int> l(n+1), r(n+1); for(int i = 1; i <= n; i++){ cin >> l[i] >> r[i]; } int N = 1; while(N < n) N*=2; int M = N*2-1; auto get = [&](int l, int r) -> vector<int>{ vector<int> res; auto dfs = [&](auto dfs, int u, int low, int high) -> void{ if(low > r || l > high) return; if(low >= l && r >= high){ res.push_back(u); return; } int mid = (low+high)/2; dfs(dfs, u*2, low, mid); dfs(dfs, u*2+1, mid+1, high); }; dfs(dfs, 1, 1, N); return res; }; vector<vector<pair<int, int>>> adj_rev(M+1); auto add_edge = [&](int u, int v, int w) -> void{ adj_rev[v].push_back({u, w}); }; auto dfs = [&](auto dfs, int u, int low, int high) -> void{ if(low == high) return; int mid = (low+high)/2; add_edge(u, u*2, 0); add_edge(u, u*2+1, 0); dfs(dfs, u*2, low, mid); dfs(dfs, u*2+1, mid+1, high); }; dfs(dfs, 1, 1, N); for(int i = 1; i <= n; i++){ for(int j : get(l[i], r[i])){ add_edge(i+N-1, j, 1); } } vector<int> a = bfs01(M, 1+N-1, adj_rev), b = bfs01(M, n+N-1, adj_rev); vector<int> dab(M+1, INF); for(int i = 1; i <= n; i++){ dab[i+N-1] = a[i+N-1] + b[i+N-1]; if(i != 1 && i != n){ dab[i+N-1]--; } } vector<int> d = dijkstra(M, dab, adj_rev); for(int i = 1; i <= n; i++){ int j = i+N-1; if(d[j] > n){ d[j] = -1; } } int q; cin >> q; for(int i = 1; i <= q; i++){ int x; cin >> x; cout << d[x+N-1] << "\n"; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...