제출 #1173566

#제출 시각아이디문제언어결과실행 시간메모리
1173566pinbuEvent Hopping (BOI22_events)C++20
100 / 100
155 ms20548 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100005; int n, q; int num = -1; array<int, 2> a[N]; int comp[N << 1]; struct SegmentTree { array<int, 2> val[1 << 19]; void build(int id = 1, int l = 1, int r = num) { val[id] = {N << 4, N << 4}; if (l == r) return; int mid = l + r >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); } void update(int i, int v, int idx, int id = 1, int l = 1, int r = num) { val[id] = min(val[id], {v, idx}); if (l == r) return; int mid = l + r >> 1; i <= mid ? update(i, v, idx, id << 1, l, mid) : update(i, v, idx, id << 1 | 1, mid + 1, r); } array<int, 2> get(int Lf, int Rt, int id = 1, int l = 1, int r = num) { if (Lf <= l && r <= Rt) return val[id]; int mid = l + r >> 1; array<int, 2> res = {N << 4, N << 4}; if (Lf <= mid) res = min(res, get(Lf, Rt, id << 1, l, mid)); if (Rt > mid) res = min(res, get(Lf, Rt, id << 1 | 1, mid + 1, r)); return res; } } T; int prv[N][17], cost[N][17]; signed main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> q; for (int i = 1, l, r; i <= n; i++) { cin >> l >> r; a[i] = {l, r}; comp[++num] = l; comp[++num] = r; } sort(comp, comp + 2 * n); num = unique(comp, comp + 2 * n) - comp; T.build(); for (int i = 1; i <= n; i++) { a[i][0] = lower_bound(comp, comp + num, a[i][0]) - comp + 1; a[i][1] = lower_bound(comp, comp + num, a[i][1]) - comp + 1; T.update(a[i][1], a[i][0], i); } for (int i = 1; i <= n; i++) { prv[i][0] = T.get(a[i][0], a[i][1])[1]; cost[i][0] = i != prv[i][0]; } for (int k = 1; k < 17; k++) { for (int i = 1; i <= n; i++) { prv[i][k] = prv[prv[i][k - 1]][k - 1]; cost[i][k] = cost[i][k - 1] + cost[prv[i][k - 1]][k - 1]; } } while (q--) { int s, e; cin >> s >> e; if (s == e) { cout << "0\n"; continue; } int ans = 0; for (int k = 16; k >= 0; k--) { if (a[prv[e][k]][0] > a[s][1]) { ans += cost[e][k]; e = prv[e][k]; } } if (a[e][0] <= a[s][1] && a[s][1] <= a[e][1]) { cout << ans + 1 << '\n'; continue; } ans += cost[e][0]; e = prv[e][0]; if (a[e][0] <= a[s][1] && a[s][1] <= a[e][1]) { cout << ans + 1 << '\n'; continue; } else { cout << "impossible\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...
#Verdict Execution timeMemoryGrader output
Fetching results...