제출 #1274536

#제출 시각아이디문제언어결과실행 시간메모리
1274536MisterReaperRailway Trip 2 (JOI22_ho_t4)C++20
0 / 100
2096 ms15580 KiB
// File railwaytrip.cpp created on 29.09.2025 at 21:19:43 #include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "/home/ahmetalp/Desktop/Workplace/debug.h" #else #define debug(...) void(23) #endif template<typename T> bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } template<typename T> bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } constexpr int max_N = int(1E5) + 5; int logs[max_N]; template<typename T, typename F> struct SparseTable { int n; F fun; std::vector<std::vector<T>> mat; SparseTable() {} SparseTable(std::vector<T>& x, F fun_) : n(x.size()), fun(fun_) { int lg = logs[n] + 1; mat.resize(lg); mat[0].resize(n); for (int i = 0; i < n; ++i) { mat[0][i] = x[i]; } for (int i = 1; i < lg; ++i) { int m = n - (1 << i) + 1; mat[i].resize(m); for (int j = 0; j < m; ++j) { mat[i][j] = fun(mat[i - 1][j], mat[i - 1][j + (1 << (i - 1))]); } } } T get(int l, int r) { int d = r - l + 1; int lg = logs[d]; return fun(mat[lg][l], mat[lg][r - (1 << lg) + 1]); } }; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); logs[0] = -1; for (int i = 1; i < max_N; ++i) { logs[i] = logs[i >> 1] + 1; } int N, K; std::cin >> N >> K; int M; std::cin >> M; std::vector<std::array<int, 2>> A(M); for (int i = 0; i < M; ++i) { std::cin >> A[i][0] >> A[i][1]; --A[i][0], --A[i][1]; } const int LG = logs[N]; std::vector<int> gol(N), gor(N); { std::vector<std::vector<int>> mat(LG, std::vector<int>(N)); auto update = [&](int a, int b, int x) -> void { int d = b - a + 1; int lg = logs[d]; chmax(mat[lg][a], x); chmax(mat[lg][b - (1 << lg) + 1], x); }; for (int i = 0; i < M; ++i) { int a = A[i][0], b = A[i][1]; if (a < b) { int l = a, r = std::min(b, a + K - 1); update(l, r, A[i][1]); } } for(int l = LG - 1; l >= 1; --l) { int m = N - (1 << l) + 1; for (int i = 0; i < m; ++i) { chmax(mat[l - 1][i], mat[l][i]); chmax(mat[l - 1][i + (1 << (l - 1))], mat[l][i]); } } for (int i = 0; i < N; ++i) { gor[i] = std::max(i, mat[0][i]); } } { std::vector<std::vector<int>> mat(LG, std::vector<int>(N, N)); auto update = [&](int a, int b, int x) -> void { int d = b - a + 1; int lg = logs[d]; chmin(mat[lg][a], x); chmin(mat[lg][b - (1 << lg) + 1], x); }; for (int i = 0; i < M; ++i) { int a = A[i][0], b = A[i][1]; if (a > b) { int l = std::max(b, a - K + 1), r = a; update(l, r, A[i][1]); } } for(int l = LG - 1; l >= 1; --l) { int m = N - (1 << l) + 1; for (int i = 0; i < m; ++i) { chmin(mat[l - 1][i], mat[l][i]); chmin(mat[l - 1][i + (1 << (l - 1))], mat[l][i]); } } for (int i = 0; i < N; ++i) { gol[i] = std::min(i, mat[0][i]); } } SparseTable str(gor, [&](auto lhs, auto rhs) { return std::max(lhs, rhs); }); SparseTable stl(gol, [&](auto lhs, auto rhs) { return std::min(lhs, rhs); }); int Q; std::cin >> Q; while (Q--) { int S, T; std::cin >> S >> T; --S, --T; int ans = -1; int L = S, R = S; for (int i = 0; ; i++) { if (L <= T && T <= R) { ans = i; break; } int l = std::min(L, stl.get(L, R)); int r = std::max(R, str.get(L, R)); if (L == l && r == R) { break; } L = l; R = r; } std::cout << ans << '\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...