제출 #573646

#제출 시각아이디문제언어결과실행 시간메모리
573646eecsEvent Hopping (BOI22_events)C++17
40 / 100
1604 ms366828 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 100010, SZ = 600; int n, q, b[maxn], rmq[20][maxn], bel[maxn], bl[maxn], br[maxn]; int num[maxn / SZ + 5][SZ + 5], pos[maxn][SZ + 5], tmp[maxn]; array<int, 2> a[maxn]; vector<int> tr[maxn]; int main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> q; vector<int> V; for (int i = 1; i <= n; i++) { cin >> a[i][0] >> a[i][1], V.push_back(a[i][1]); } sort(V.begin(), V.end()); V.resize(unique(V.begin(), V.end()) - V.begin()); fill(b + 1, b + n + 1, n + 1); for (int i = 1; i <= n; i++) { a[i][0] = lower_bound(V.begin(), V.end(), a[i][0]) - V.begin() + 1; a[i][1] = lower_bound(V.begin(), V.end(), a[i][1]) - V.begin() + 1; b[a[i][1]] = min(b[a[i][1]], a[i][0]); } for (int i = 1; i <= n; i++) { br[bel[i] = (i - 1) / SZ + 1] = i; if (!bl[bel[i]]) bl[bel[i]] = i; } copy(b + 1, b + n + 1, rmq[0] + 1); for (int k = 1; k < 20; k++) { for (int i = 1; i + (1 << k) - 1 <= n; i++) { rmq[k][i] = min(rmq[k - 1][i], rmq[k - 1][i + (1 << (k - 1))]); } } auto qmin = [&](int l, int r) { int k = __lg(r - l + 1); return min(rmq[k][l], rmq[k][r - (1 << k) + 1]); }; auto go = [&](int s, int r) { int lb = s + 1, rb = r, ans = 0; while (lb <= rb) { int mid = (lb + rb) / 2; qmin(mid, r) <= s ? lb = (ans = mid) + 1 : rb = mid - 1; } return ans; }; for (int k = 1; k <= bel[n]; k++) { for (int i = br[k], j = br[k]; i >= bl[k]; i--) { for (; j >= max(bl[k], b[i]); j--) num[k][j - bl[k]] = j < i ? i : 0; } } for (int i = 1; i <= n; i++) { int k = bel[i], L = bl[k], R = br[k]; tr[i].reserve(R - i); for (int j = num[k][i - L]; j && j <= R; j = num[k][j - L]) { tr[i].push_back(j); } for (int j = L, k = 0; j <= R; j++) { while (k < tr[i].size() && tr[i][k] < j) k++; pos[i][j - L] = k; } } while (q--) { int s, t, ans = 0; cin >> s >> t; if (s == t) { cout << "0\n"; continue; } for (s = a[s][1]; s && s < a[t][0]; ans++) { if (bel[s] == bel[a[t][0]]) { for (int i = a[t][0], j = a[t][0]; i >= s; i--) { int v = i == a[t][0] ? qmin(i, a[t][1]) : b[i]; for (; j >= max(s, v); j--) tmp[j - s] = j < i ? i : 0; } for (int o = s; s && s < a[t][0]; ans++) { s = tmp[s - o]; } break; } int nxt = qmin(bl[bel[s] + 1], a[t][1]); if (nxt <= s) { s = go(s, a[t][1]); } else { if (tr[s].empty() || nxt > tr[s].back()) { s = 0; break; } int i = pos[s][nxt - bl[bel[s]]]; ans += i, s = tr[s][i]; } } if (a[t][0] <= s && s <= a[t][1]) cout << ans + 1 << "\n"; else cout << "impossible\n"; } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

events.cpp: In function 'int main()':
events.cpp:59:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |             while (k < tr[i].size() && tr[i][k] < j) k++;
      |                    ~~^~~~~~~~~~~~~~
#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...