제출 #1172062

#제출 시각아이디문제언어결과실행 시간메모리
1172062yoav_sEvent Hopping (BOI22_events)C++20
100 / 100
276 ms42468 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> v; typedef vector<v> vv; typedef vector<vv> vvv; typedef pair<ll, ll> p; typedef vector<p> vp; typedef vector<vp> vvp; typedef vector<vvp> vvvp; typedef pair<ll, p> tri; typedef vector<tri> vtri; typedef vector<vtri> vvtri; typedef vector<vvtri> vvvtri; typedef vector<bool> vb; typedef vector<vb> vvb; typedef vector<vvb> vvvb; #define f first #define s second #define pb push_back #define eb emplace_back #define all(v) (v).begin(),(v).end() const ll INF = 1e18; const ll mod = 1e9 + 7; ll query(vp &st, ll l, ll r) { l += st.size() / 2; r += st.size() / 2; ll bestIndex, best = INF; while (l <= r) { if (l % 2 == 1) { if (st[l].f < best) { best = st[l].f; bestIndex = st[l].s; } l++; } if (r % 2 == 0) { if (st[r].f < best) { best = st[r].f; bestIndex = st[r].s; } r--; } l /= 2; r /= 2; } return bestIndex; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); ll N, Q; cin >> N >> Q; vp events(N); for (ll i = 0; i < N; i++) cin >> events[i].f >> events[i].s; v numbers; for (ll i = 0; i < N; i++) { numbers.pb(events[i].f); numbers.pb(events[i].s); } sort(all(numbers)); numbers.erase(unique(all(numbers)),numbers.end()); map<ll, ll> shrink; for (ll i = 0; i < numbers.size(); i++) shrink[numbers[i]] = i; for (ll i = 0; i < N; i++) { events[i].f = shrink[events[i].f]; events[i].s = shrink[events[i].s]; } ll m = numbers.size(); ll n = pow(2, ceil(log2(m))); vp st(2 * n, p(INF, -1)); for (ll i = 0; i < N; i++) if (events[i].f < st[n + events[i].s].f) st[n + events[i].s] = p(events[i].f, i); for (ll i = n - 1; i > 0; i--) { if (st[2 * i].f < st[2 * i + 1].f) st[i] = st[2 * i]; else st[i] = st[2 * i + 1]; } v prev(N); for (ll curEvent = 0; curEvent < N; curEvent++) { ll bestEvent = query(st, events[curEvent].f, events[curEvent].s); //TODO check if worse than curEvent prev[curEvent] = bestEvent; } ll logN = log2(N); vv prevLifting(N, v(logN + 1, -1)); for (ll i = 0; i < N; i++) prevLifting[i][0] = prev[i]; for (ll j = 1; j <= logN; j++) { for (ll i = 0; i < N; i++) { prevLifting[i][j] = prevLifting[prevLifting[i][j - 1]][j - 1]; } } while (Q--) { ll s, e; cin >> s >> e; s--; e--; if (s == e) { cout << "0\n"; continue; } if (events[s].s > events[e].s) { cout << "impossible\n"; continue; } if (events[e].f <= events[s].s && events[e].s >= events[s].s) { cout << "1\n"; continue; } ll curEvent = e; ll hops = 0; for (ll j = logN; j >= 0; j--) { ll next = prevLifting[curEvent][j]; if (events[s].s < events[next].f) { curEvent = next; hops += (1 << j); } } curEvent = prev[curEvent]; hops++; if (events[s].s >= events[curEvent].f) { cout << hops + 1 << "\n"; continue; } 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...