Submission #1317034

#TimeUsernameProblemLanguageResultExecution timeMemory
1317034JahonaliXPassport (JOI23_passport)C++20
100 / 100
447 ms90536 KiB
#include <bits/stdc++.h> using namespace std; #define int long long constexpr int mod = 1e9 + 7, inf = 1e17; struct segment_tree { int n; vector<vector<int>> a; vector<int> id, val; void build(int v = 1, int l = 0, int r = -1) { if (r < 0) r += n; if (l == r) id[l] = v, val[v] = l; else { int m = (l + r) >> 1; build(v << 1, l, m); build(v << 1 | 1, m + 1, r); } } segment_tree(int m) { n = m, a.assign(n << 2, {}), id.assign(n, 0), val.assign(n << 2, -1), build(); } void update(int L, int R, int x, int v = 1, int l = 0, int r = -1) { if (r < 0) r += n; if (L <= l && r <= R) a[v].emplace_back(id[x]); else { int m = (l + r) >> 1; if (L <= m) update(L, R, x, v << 1, l, m); if (R > m) update(L, R, x, v << 1 | 1, m + 1, r); } } vector<int> answer() { vector<int> dp(n << 2, inf), dpl = dp, dpr = dp, ret(n, -1); dpl[id[0]] = 0; priority_queue<pair<int, int>> q; q.emplace(0, id[0]); while (!q.empty()) { auto [w, i] = q.top(); q.pop(); if (i > 1 && dpl[i / 2] > -w) dpl[i / 2] = -w, q.emplace(w, i / 2); for (int j : a[i]) { if (dpl[j] < -w + 2) continue; dpl[j] = -w + 1; q.emplace(w - 1, j); } } dpr[id[n - 1]] = 0; q.emplace(0, id[n - 1]); while (!q.empty()) { auto [w, i] = q.top(); q.pop(); if (i > 1 && dpr[i / 2] > -w) dpr[i / 2] = -w, q.emplace(w, i / 2); for (int j : a[i]) { if (dpr[j] < -w + 2) continue; dpr[j] = -w + 1; q.emplace(w - 1, j); } } for (int i = 1; i < (n << 2); ++i) { if (val[i] == -1) continue; dp[i] = min(inf, dpl[i] + dpr[i] + 1 - (val[i] != 0) - (val[i] != n - 1)), q.emplace(-dp[i], i); } while (!q.empty()) { auto [w, i] = q.top(); q.pop(); if (i > 1 && dp[i / 2] > -w) dp[i / 2] = -w, q.emplace(w, i / 2); for (int j : a[i]) { if (dp[j] < -w + 2) continue; dp[j] = -w + 1; q.emplace(w - 1, j); } } for (int i = 1; i < (n << 2); ++i) { if (dp[i] == inf || val[i] == -1) continue; ret[val[i]] = dp[i]; } return ret; } }; int32_t main() { #ifdef JahonaliX freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; vector<int> l(n), r(n); for (int i = 0; i < n; ++i) cin >> l[i] >> r[i], l[i]--, r[i]--; segment_tree s(n); for (int i = 0; i < n; ++i) s.update(l[i], r[i], i); auto dp = s.answer(); int q; cin >> q; while (q--) { int x; cin >> x; x--; cout << dp[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...