Submission #597942

#TimeUsernameProblemLanguageResultExecution timeMemory
597942maomao90Event Hopping (BOI22_events)C++17
100 / 100
147 ms37288 KiB
#include <bits/stdc++.h> using namespace std; #define REP(i, j, k) for (int i = j; i < k; i++) #define RREP(i, j, k) for (int i = j; i >= k; i--) template <class T> inline bool mnto(T &a, const T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T &a, const T b) {return a < b ? a = b, 1 : 0;} typedef long long ll; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; #define ALL(x) x.begin(), x.end() #define SZ(x) (int) x.size() #define pb push_back typedef vector<int> vi; typedef vector<ii> vii; typedef vector<ll> vll; typedef tuple<int, int, int> iii; #ifndef DEBUG #define cerr if (0) cerr #endif const int MAXN = 200005; const int INF = 1000000005; const ll LINF = 1000000000000000005; const int MAXL = 20; struct event { int s, e, i; }; int n, q; event se[MAXN]; int mp[MAXN]; int p[MAXL][MAXN]; int m; int sp[MAXL][MAXN]; int qmn(int s, int e) { int k = 31 - __builtin_clz(e - s + 1); return min(sp[k][s], sp[k][e - (1 << k) + 1]); } int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif cin >> n >> q; REP (i, 1, n + 1) { cin >> se[i].s >> se[i].e; se[i].i = i; } sort(se + 1, se + n + 1, [&] (event l, event r) { return l.s < r.s; }); vii disc; REP (i, 1, n + 1) { mp[se[i].i] = i; disc.pb({se[i].s, i}); disc.pb({se[i].e, i + n}); } sort(ALL(disc)); int prv = -1; for (auto [x, i] : disc) { if (x != prv) { prv = x; m++; } if (i <= n) { se[i].s = m; } else { se[i - n].e = m; } } REP (i, 1, n + 1) { cerr << i << ": " << se[i].s << ' ' << se[i].e << '\n'; } memset(p, -1, sizeof p); REP (i, 1, m + 1) { sp[0][i] = INF; } REP (i, 1, n + 1) { mnto(sp[0][se[i].e], i); } REP (k, 1, MAXL) { REP (i, 1, m + 1 - (1 << k - 1)) { sp[k][i] = min(sp[k - 1][i], sp[k - 1][i + (1 << k - 1)]); } } REP (i, 1, n + 1) { p[0][i] = qmn(se[i].s, se[i].e); cerr << i << " -> " << p[0][i] << '\n'; } /* REP (i, 1, n + 1) { ii mn = {INF, -1}; REP (j, 1, n + 1) { if (i == j) { continue; } if (se[i].s <= se[j].e && se[j].e <= se[i].e) { mnto(mn, {se[j].s, j}); } } p[0][i] = mn.SE; cerr << i << " -> " << p[0][i] << '\n'; } */ REP (k, 1, MAXL) { REP (i, 1, n + 1) { if (p[k - 1][i] == -1) { p[k][i] = -1; } else { p[k][i] = p[k - 1][p[k - 1][i]]; } } } while (q--) { int a, b; cin >> a >> b; a = mp[a]; b = mp[b]; if (a == b) { cout << 0 << '\n'; continue; } if (se[b].s <= se[a].e && se[a].e <= se[b].e) { cout << 1 << '\n'; continue; } if (se[a].e > se[b].e) { cout << "impossible\n"; continue; } int ans = 0; RREP (k, MAXL - 1, 0) { if (p[k][b] == -1) { continue; } if (se[p[k][b]].s > se[a].e) { b = p[k][b]; ans += 1 << k; } } if (p[0][b] != -1 && se[p[0][b]].s <= se[a].e) { ans += 2; cout << ans << '\n'; } else { cout << "impossible\n"; } } return 0; }

Compilation message (stderr)

events.cpp: In function 'int main()':
events.cpp:93:29: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   93 |  REP (i, 1, m + 1 - (1 << k - 1)) {
      |                           ~~^~~
events.cpp:4:42: note: in definition of macro 'REP'
    4 | #define REP(i, j, k) for (int i = j; i < k; i++)
      |                                          ^
events.cpp:94:57: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   94 |      sp[k][i] = min(sp[k - 1][i], sp[k - 1][i + (1 << k - 1)]);
      |                                                       ~~^~~
#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...