Submission #864250

#TimeUsernameProblemLanguageResultExecution timeMemory
864250danikoynovEvent Hopping (BOI22_events)C++14
25 / 100
1582 ms9960 KiB
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; struct interval { int s, e, idx; }seg[maxn]; int n, q; pair < int, int > task[maxn]; void input() { cin >> n >> q; for (int i = 1; i <= n; i ++) { cin >> seg[i].s >> seg[i].e; seg[i].idx = i; } for (int i = 1; i <= q; i ++) { cin >> task[i].first >> task[i].second; } } bool cmp_end(interval seg1, interval seg2) { return seg1.e < seg2.e; } int lf[maxn], rev[maxn], rf[maxn]; map < int, int > fix; void build_graph() { sort(seg + 1, seg + n + 1, cmp_end); for (int i = 1; i <= n; i ++) { rev[seg[i].idx] = i; } for (int i = 1; i <= n; i ++) { int l = 1; int r = i; while(l <= r) { int m = (l + r) / 2; if (seg[m].e < seg[i].s) l = m + 1; else r = m - 1; } lf[i] = l; //while(seg[lf[i]].e < seg[i].s) // lf[i] ++; if (fix[seg[i].e] == 0) fix[seg[i].e] = lf[i]; else fix[seg[i].e] = min(fix[seg[i].e], lf[i]); } } void answer_queries() { /**cout << "----------------------" << endl; for (int i = 1; i <= n; i ++) cout << seg[i].s << " :: " << seg[i].e << endl;*/ for (int i = 1; i <= q; i ++) { int st = rev[task[i].first], en = rev[task[i].second]; if (seg[st].e == seg[en].e && st != en) { cout << 1 << endl; continue; } if (st > en) { cout << "impossible" << endl; continue; } int steps = 0, last_left = en + 1; int bound_left = en; bool done = false; while(!(st >= bound_left)) { ///cout << last_left << " " << bound_left << endl; steps ++; int new_left = bound_left; for (int i = bound_left; i < last_left; i ++) { new_left = min(new_left, lf[i]); } ///cout << "here " << lf[en] << " " << fix[seg[en].e] << " " << seg[en].s << endl; if (steps == 2) new_left = min(new_left, fix[seg[en].e]); ///cout << new_bound << endl; if (new_left == bound_left && steps > 1) { done = true; break; } last_left = bound_left; bound_left = new_left; } if (done) cout << "impossible" << endl; else cout << steps << endl; } } void solve() { input(); build_graph(); answer_queries(); } int main() { ///speed(); solve(); 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...