제출 #745800

#제출 시각아이디문제언어결과실행 시간메모리
745800vjudge1Event Hopping (BOI22_events)C++17
0 / 100
550 ms132712 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 100001; const int K = 20; struct Node { Node *left, *right; int best = 0, tl, tr; Node(int l_, int r_) : tl(l_), tr(r_) {} void expand() { if (left == nullptr) { int tm = (tl + tr) / 2; left = new Node(tl, tm); right = new Node(tm+1, tr); } } void upd(int l, int r, int val) { if (l > r) return; if (l == tl && r == tr) { best = max(best, val); } else { expand(); int m = (tl + tr) / 2; left->upd(l, min(r, m), val); right->upd(max(l, m+1), r, val); } } int qry(int pos) { if (tl == tr) { return best; } else { expand(); int m = (tl + tr) / 2; if (pos <= m) { return max(best, left->qry(pos)); } else { return max(best, right->qry(pos)); } } } }; int up[MAXN][K]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; Node *root = new Node(1, 1e9); vector<pair<int, int>> events(n+1); map<int, int> m; for (int i = 1; i <= n; i++) { cin >> events[i].first >> events[i].second; if (m.count(events[i].second)) { if (events[m[events[i].second]].first > events[i].first) { m[events[i].second] = i; } } else { m[events[i].second] = i; } root->upd(events[i].first, events[i].second, events[i].second); } for (int i = 1; i <= n; i++) { up[i][0] = m[root->qry(events[i].second)]; } for (int i = 1; i <= n; i++) { for (int j = 1; j < K; j++) { up[i][j] = up[up[i][j-1]][j-1]; } } while (q--) { int a, b; cin >> a >> b; int ans = 0; for (int it = 0; it < 30 && a != b; it++) { int best = -1, cur = 0; for (int i = 0; i < K && up[a][i]; i++) { if (events[up[a][i]].second <= events[b].second && up[a][i] != a && (i == 0 || up[a][i] != up[a][i-1])) { best = up[a][i]; cur = 1 << i; } } if (best != -1) { a = best; ans += cur; } } auto [sa, ea] = events[a]; auto [sb, eb] = events[b]; if (ea < sb || sa > sb) { cout << "impossible\n"; } else { if (sa < sb) ans++; cout << ans << "\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...