Submission #1173579

#TimeUsernameProblemLanguageResultExecution timeMemory
1173579pinbuEvent Hopping (BOI22_events)C++20
100 / 100
171 ms44552 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100005; void mini(array<int, 2> &X, array<int, 2> Y) {if (X > Y) X = Y;} int n, q; int num = -1; array<int, 2> a[N]; int comp[N << 1]; array<int, 2> SpT[N << 1][18]; 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; for (int i = 1; i <= num; i++) { SpT[i][0] = {N << 2, N << 2}; } 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; mini(SpT[a[i][1]][0], {a[i][0], i}); } for (int k = 1; k < 18; k++) { for (int i = 1; i + (1 << k) - 1 <= num; i++) { SpT[i][k] = min(SpT[i][k - 1], SpT[i + (1 << (k - 1))][k - 1]); } } auto gtmin = [&] (int l, int r) { int k = __lg(r - l + 1); return min(SpT[l][k], SpT[r - (1 << k) + 1][k])[1]; }; for (int i = 1; i <= n; i++) { prv[i][0] = gtmin(a[i][0], a[i][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...