Submission #1072095

#TimeUsernameProblemLanguageResultExecution timeMemory
1072095duckindogEvent Hopping (BOI22_events)C++17
100 / 100
106 ms38592 KiB
#include <bits/stdc++.h> using namespace std; const int N = 200'000 + 10; int n, q; struct Event { int st, ed, idx; } a[N]; int rvs[N]; int lg[N]; int f[N][19]; int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> q; for (int i = 1; i <= n; ++i) cin >> a[i].st >> a[i].ed, a[i].idx = i; sort(a + 1, a + n + 1, [&](const auto& a, const auto& b) { return a.ed < b.ed; }); for (int i = 1; i <= n; ++i) rvs[a[i].idx] = i; for (int i = 2; i < N; ++i) lg[i] = lg[i >> 1] + 1; { //init vector<int> rrh; for (int i = 1; i <= n; ++i) { rrh.push_back(a[i].st); rrh.push_back(a[i].ed); } sort(rrh.begin(), rrh.end()); rrh.erase(unique(rrh.begin(), rrh.end()), rrh.end()); a[0] = {1'000'000, 1'000'000}; vector<vector<int>> save(rrh.size() + 1); for (int i = 1; i <= n; ++i) { a[i].st = upper_bound(rrh.begin(), rrh.end(), a[i].st) - rrh.begin(); a[i].ed = upper_bound(rrh.begin(), rrh.end(), a[i].ed) - rrh.begin(); save[a[i].ed].push_back(i); } vector<array<int, 19>> st(rrh.size() + 1); using pii = pair<int, int>; priority_queue<pii, vector<pii>, greater<>> q; for (int i = 1; i <= rrh.size(); ++i) { for (const auto& idx : save[i]) q.push({a[idx].st, idx}); while (q.size() && a[q.top().second].ed < i) q.pop(); st[i][0] = (!q.size() ? 0 : q.top().second); } for (int j = 1; j <= 18; ++j) { for (int i = 1; i + (1 << j) - 1 <= rrh.size(); ++i) { int lt = st[i][j - 1], rt = st[i + (1 << j - 1)][j - 1]; st[i][j] = (a[lt].st < a[rt].st ? lt : rt); } } auto get = [&](int l, int r) { int j = lg[r - l + 1]; int lt = st[l][j], rt = st[r - (1 << j) + 1][j]; return a[lt].st < a[rt].st ? lt : rt; }; for (int i = 1; i <= n; ++i) f[i][0] = get(a[i].st, a[i].ed); } auto in = [&](int x, int y) { return a[y].st <= a[x].ed && a[x].ed <= a[y].ed; }; for (int j = 1; j <= 18; ++j) { for (int i = n; i >= 1; --i) f[i][j] = f[f[i][j - 1]][j - 1]; } while (q--) { int x, y; cin >> x >> y; x = rvs[x]; y = rvs[y]; if (in(x, y)) { cout << 1 - (x == y) << "\n"; continue; } if (a[x].st >= a[y].ed) { cout << "impossible\n"; continue; } int answer = 1; for (int i = 18; i >= 0; --i) { if (!in(x, f[y][i]) && a[f[y][i]].ed >= a[x].ed) { answer += (1 << i); y = f[y][i]; } } y = f[y][0]; if (!in(x, y)) { cout << "impossible\n"; continue; } cout << answer + (x != y) << "\n"; } }

Compilation message (stderr)

events.cpp: In function 'int32_t main()':
events.cpp:45:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for (int i = 1; i <= rrh.size(); ++i) {
      |                     ~~^~~~~~~~~~~~~
events.cpp:52:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |       for (int i = 1; i + (1 << j) - 1 <= rrh.size(); ++i) {
      |                       ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
events.cpp:53:52: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   53 |         int lt = st[i][j - 1], rt = st[i + (1 << j - 1)][j - 1];
      |                                                  ~~^~~
#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...