제출 #1172142

#제출 시각아이디문제언어결과실행 시간메모리
1172142IskachunEvent Hopping (BOI22_events)C++20
100 / 100
191 ms42468 KiB
#include <iostream> #include <vector> #include <algorithm> #include <map> #include <cmath> using namespace std; typedef long long ll; # define f first # define s second const ll inf = 1e18; vector<pair<ll,ll>> a; ll ask (ll l, ll r) { ll n = a.size(); l += n / 2, r += n / 2; ll pos, best = inf; while (l <= r) { if (l % 2 == 1) { if (a[l].first < best) best = a[l].first, pos = a[l].second; l++; } if (r % 2 == 0) { if (a[r].first < best) best = a[r].first, pos = a[r].second; r--; } l /= 2; r /= 2; } return pos; } void solve () { ll n, q; cin >> n >> q; vector<pair<ll, ll>> ev(n); for (auto &[x, y] : ev) cin >> x >> y; vector<ll> num; for (auto [x, y] : ev) num.push_back(x), num.push_back(y); sort(num.begin(), num.end()); num.erase(unique(num.begin(), num.end()), num.end()); map<ll, ll> mp; ll m = num.size(); for (ll i = 0; i < m; i++) mp[num[i]] = i; for (auto &[x, y] : ev) x = mp[x], y = mp[y]; ll k = pow(2, ceil(log2(m))); a = vector<pair<ll, ll>> (2 * k, make_pair(inf, -1)); for (ll i = 0; i < n; i++) { if (ev[i].first < a[k + ev[i].second].first) { a[k + ev[i].second] = {ev[i].first, i}; } } for (ll i = k - 1; i > 0; i--) { if (a[2 * i].first < a[2 * i + 1].first) a[i] = a[2 * i]; else a[i] = a[2 * i + 1]; } ll logn = log2(n); vector<vector<ll>> prev2(n, vector<ll> (logn + 1, -1)); vector<ll> prev(n); for (ll i = 0; i < n; i++) { prev[i] = ask(ev[i].first, ev[i].second); prev2[i][0] = prev[i]; } for (ll i = 1; i <= logn; i++) for (ll j = 0; j < n; j++) { prev2[j][i] = prev2[prev2[j][i - 1]][i - 1]; } while (q--) { ll s, e; cin >> s >> e; s--, e--; if (s == e) {cout << "0\n"; continue;} if (ev[s].second > ev[e].second) {cout << "impossible\n"; continue;} if (ev[e].first <= ev[s].second and ev[e].second >= ev[s].second) {cout << "1\n"; continue;} ll curr = e, cnt = 0; for (ll i = logn; i >= 0; i--) { ll nxt = prev2[curr][i]; if (ev[s].second < ev[nxt].first) curr = nxt, cnt += (1 << i); } curr = prev[curr], cnt++; if (ev[s].second >= ev[curr].first) cout << cnt + 1 << '\n'; else cout << "impossible\n"; } } int main() { //freopen("filename.in", "r", stdin), freopen("filename.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; //cin >> t; while (t--) solve(); }
#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...