제출 #1092927

#제출 시각아이디문제언어결과실행 시간메모리
1092927Trisanu_DasRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
518 ms41764 KiB
#include <bits/stdc++.h> using namespace std; const int Z = 1e5; const int B = 17; int N, K, M; struct SegmentTree { int a[2 * Z] = {}; int minQuery = 0; void update(int i, int value) { i += N; if (minQuery) a[i] = max(a[i], Z - value); else a[i] = max(a[i], value); for (i /= 2; i >= 1; i /= 2) { a[i] = max(a[2 * i], a[2 * i + 1]); } } int query(int l, int r) { int result = 0; l += N; r += N + 1; while (l < r) { if (l & 1) result = max(result, a[l++]); if (r & 1) result = max(result, a[--r]); l /= 2; r /= 2; } return minQuery ? Z - result : result; } int operator[](int i) { return minQuery ? Z - a[i + N] : a[i + N]; } } segmentTree[2][B]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N >> K >> M; priority_queue<array<int, 2>> pq[2]; vector<array<int, 2>> updates[2][N]; while (M--) { int l, r; cin >> l >> r; --l, --r; if (l < r) updates[1][l].push_back({r, min(l + K - 1, r)}); else updates[0][max(l - K + 1, r)].push_back({-r, l}); } for (int i = 0; i < B; ++i) { segmentTree[0][i].minQuery = 1; } for (int i = 0; i < N; ++i) { for (int j : {0, 1}) { for (auto k : updates[j][i]) pq[j].push(k); while (!pq[j].empty() && pq[j].top()[1] < i) pq[j].pop(); int topVal = pq[j].empty() ? i : (j ? 1 : -1) * pq[j].top()[0]; segmentTree[j][0].update(i, topVal); } } for (int k = 0; k + 1 < B; ++k) { for (int j : {0, 1}) { for (int i = 0; i < N; ++i) { int left = segmentTree[0][k][i]; int right = segmentTree[1][k][i]; segmentTree[j][k + 1].update(i, segmentTree[j][k].query(left, right)); } } } cin >> M; while (M--) { int l, t; cin >> l >> t; --l; --t; int r = l; int steps = 0; for (int i = B - 1; i >= 0; --i) { int left = segmentTree[0][i].query(l, r); int right = segmentTree[1][i].query(l, r); if (left > t || t > right) { l = left; r = right; steps |= 1 << i; } } cout << (steps + 1 > N ? -1 : steps + 1) << '\n'; } }
#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...