제출 #937716

#제출 시각아이디문제언어결과실행 시간메모리
937716LucaIlieEvent Hopping (BOI22_events)C++17
25 / 100
1595 ms8872 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5; const int MAX_LOG_N = 16; const int MAX_T = 2e5; struct event { int i, s, e; }; int prv[MAX_LOG_N + 1][MAX_N + 1]; event events[MAX_N + 1]; map<int, int> nrm; bool canSwitch( event a, event b ) { return (b.s <= a.e && a.e <= b.e); } int main() { int n, q; cin >> n >> q; for ( int i = 1; i <= n; i++ ) { cin >> events[i].s >> events[i].e; nrm[events[i].s] = nrm[events[i].e] = 1; events[i].i = i + 1; } int t = 0; for ( auto p: nrm ) nrm[p.first] = ++t; for ( int i = 1; i <= n; i++ ) { events[i].s = nrm[events[i].s]; events[i].e = nrm[events[i].e]; } for ( int i = 1; i <= n; i++ ) { prv[0][i] = i; for ( int j = 1; j <= n; j++ ) { if ( canSwitch( events[j], events[i] ) ) { if ( events[j].s < events[prv[0][i]].s ) prv[0][i] = j; } } } for ( int p = 1; p <= MAX_LOG_N; p++ ) { for ( int i = 1; i <= n; i++ ) prv[p][i] = prv[p - 1][prv[p - 1][i]]; } while ( q-- ) { int s, e; cin >> s >> e; int i = e, x = 0; for ( int p = MAX_LOG_N; p >= 0; p-- ) { if ( events[prv[p][i]].s > events[s].e ) { i = prv[p][i]; x += (1 << p); } } if ( events[i].s > events[s].e ) { i = prv[0][i]; x++; } if ( s == e ) cout << 0 << "\n"; else if ( canSwitch( events[s], events[i] ) ) cout << x + 1 << "\n"; else 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...