Submission #1308261

#TimeUsernameProblemLanguageResultExecution timeMemory
1308261kian2009Passport (JOI23_passport)C++20
100 / 100
519 ms84848 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int MAXN = 2e5 + 10, INF = 1e6; int n, l[MAXN], r[MAXN], lc[4 * MAXN], rc[4 * MAXN], d[3][4 * MAXN], cnt; bool seen[3][4 * MAXN]; vector<pair<int, int>> adj[4 * MAXN]; void input() { cin >> n; for (int i = 0; i < n; i++) { cin >> l[i] >> r[i]; --l[i]; } cnt = n + 1; } void make(int u, int l, int r) { if (r - l == 1) { adj[l].push_back({u, 0}); return; } int mid = (l + r) / 2; lc[u] = cnt++; rc[u] = cnt++; adj[lc[u]].push_back({u, 0}); adj[rc[u]].push_back({u, 0}); make(lc[u], l, mid); make(rc[u], mid, r); } void add_edge(int u, int l, int r, int s, int e, int i) { if (s <= l && r <= e) { adj[u].push_back({i, 1}); return; } if (e <= l || r <= s) return; int mid = (l + r) / 2; add_edge(lc[u], l, mid, s, e, i); add_edge(rc[u], mid, r, s, e, i); } void dij(int t) { priority_queue<pii, vector<pii>, greater<pii>> q; if (t == 0) { q.push({0, 0}); d[t][0] = 0; } if (t == 1) { q.push({0, n - 1}); d[t][n - 1] = 0; } if (t == 2) for (int i = 0; i < n; i++) q.push({d[t][i], i}); while (!q.empty()) { int u = q.top().second, d1 = q.top().first; q.pop(); if (!seen[t][u]) { seen[t][u] = true; for (auto p : adj[u]) { int v = p.first, d2 = d1 + p.second; if (d2 < d[t][v]) { d[t][v] = d2; q.push({d2, v}); } } } } } void findAns() { for (int i = 0; i < cnt; i++) d[0][i] = d[1][i] = d[2][i] = INF; dij(0); dij(1); for (int i = 0; i < n; i++) d[2][i] = (d[0][i] + d[1][i] - (i != 0 && i != (n - 1))); dij(2); } int main() { ios::sync_with_stdio(false); cin.tie(0); input(); make(n, 0, n); for (int i = 0; i < n; i++) add_edge(n, 0, n, l[i], r[i], i); findAns(); int q; cin >> q; for (int i = 0; i < q; i++) { int x; cin >> x; --x; cout << (d[2][x] >= MAXN? -1: d[2][x]) << '\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...