제출 #1320016

#제출 시각아이디문제언어결과실행 시간메모리
1320016vuvietPassport (JOI23_passport)C++20
54 / 100
2098 ms73940 KiB
/** * Author: trviet * Studies at: Le Hong Phong High School for the Gifted **/ #include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; constexpr int maxn = 2e5 + 5, inf = 1e9; int n, q, pos[maxn], l[maxn], r[maxn]; vector<pii> graph[4 * maxn]; void Build(int id, int l, int r) { if (l == r) { pos[l] = id; return; } int mid = (l + r) >> 1; Build(id << 1, l, mid); Build(id << 1 | 1, mid + 1, r); graph[id << 1].push_back({id, 0}); graph[id << 1 | 1].push_back({id, 0}); } void Update(int id, int l, int r, int u, int v, int k, int w) { if (r < u || l > v) return; if (u <= l && r <= v) { graph[id].push_back({pos[k], w}); return; } int mid = (l + r) >> 1; Update(id << 1, l, mid, u, v, k, w); Update(id << 1 | 1, mid + 1, r, u, v, k, w); } void update_bfs01(int w, int v, deque<int> &Q) { if (w == 0) { Q.push_front(v); } else { Q.push_back(v); } } vector<int> BFSVisit(int s) { vector<int> dp(4 * n + 5, inf); deque<int> Q; dp[pos[s]] = 0; Q.push_back(pos[s]); while (!Q.empty()) { int u = Q.front(); Q.pop_front(); for (int i = 0; i < graph[u].size(); ++i) { int v = graph[u][i].first, w = graph[u][i].second; if (dp[v] > dp[u] + w) dp[v] = dp[u] + w, update_bfs01(w, v, Q); } } return dp; } void ReadData() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; ++i) cin >> l[i] >> r[i]; } void Solve() { Build(1, 1, n); for (int i = 1; i <= n; ++i) Update(1, 1, n, l[i], r[i], i, 1); vector<int> f = BFSVisit(1), g = BFSVisit(n); vector<int> dp(4 * n + 5, inf); deque<int> Q; for (int i = 1; i <= n; ++i) { int u = pos[i]; if (f[u] == inf || g[u] == inf) continue; dp[u] = f[u] + g[u] - (i != 1 && i != n); Q.push_back(u); } while (!Q.empty()) { int u = Q.front(); Q.pop_front(); for (int i = 0; i < graph[u].size(); ++i) { int v = graph[u][i].first, w = graph[u][i].second; if (dp[v] > dp[u] + w) dp[v] = dp[u] + w, update_bfs01(w, v, Q); } } cin >> q; while (q-- > 0) { int x; cin >> x; cout << (dp[pos[x]] >= inf ? -1 : dp[pos[x]]) << "\n"; } } int main() { ReadData(); Solve(); 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...