제출 #1157456

#제출 시각아이디문제언어결과실행 시간메모리
1157456woohyun_jngRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1959 ms143860 KiB
#include <bits/stdc++.h> #define int long long using namespace std; typedef array<int, 2> pr; const int MAX = 300000; const int MAX_LOG = 20; const int INF = 0x3f3f3f3f3f3f3f3f; int A[MAX], B[MAX], L[MAX][MAX_LOG], R[MAX][MAX_LOG]; pr tree[MAX_LOG][MAX * 4]; vector<int> mn[MAX], mx[MAX]; pr merge(pr X, pr Y) { return {min(X[0], Y[0]), max(X[1], Y[1])}; }; void init(int idx, int n, int s, int e) { if (s == e) tree[idx][n] = {L[s][idx], R[s][idx]}; else { int m = s + e >> 1; init(idx, n << 1, s, m), init(idx, n << 1 | 1, m + 1, e); tree[idx][n] = merge(tree[idx][n << 1], tree[idx][n << 1 | 1]); } } pr query(int idx, int n, int s, int e, int l, int r) { if (r < s || e < l) return {INF, 0}; else if (l <= s && e <= r) return tree[idx][n]; else { int m = s + e >> 1; return merge(query(idx, n << 1, s, m, l, r), query(idx, n << 1 | 1, m + 1, e, l, r)); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); int N, K, M, Q, S, T, X, Y, ans = 0, st, en, md; pr V; cin >> N >> K >> M; for (int i = 1; i <= M; i++) { cin >> A[i] >> B[i]; if (A[i] <= B[i]) { X = min(B[i] - 1, A[i] + K - 1); mx[A[i]].push_back(B[i]), mx[X + 1].push_back(-B[i]); } else { X = max(B[i] + 1, A[i] - K + 1); mn[X].push_back(B[i]), mn[A[i] + 1].push_back(-B[i]); } } multiset<int> mx_st, mn_st; for (int i = 1; i <= N; i++) { for (int j : mx[i]) { if (j > 0) mx_st.insert(j); else mx_st.erase(mx_st.find(-j)); } for (int j : mn[i]) { if (j > 0) mn_st.insert(j); else mn_st.erase(mn_st.find(-j)); } L[i][0] = mn_st.empty() ? i : *mn_st.begin(); R[i][0] = mx_st.empty() ? i : *mx_st.rbegin(); } init(0, 1, 1, N); for (int i = 1; i < MAX_LOG; i++) { for (int j = 1; j <= N; j++) { V = query(i - 1, 1, 1, N, L[j][i - 1], R[j][i - 1]); L[j][i] = V[0], R[j][i] = V[1]; } init(i, 1, 1, N); } cin >> Q; while (Q--) { cin >> S >> T; st = 1, en = M, ans = -1; while (st <= en) { md = st + en >> 1; X = S, Y = S; for (int i = MAX_LOG - 1; i >= 0; i--) { if (!(md & (1ll << i))) continue; V = query(i, 1, 1, N, X, Y); X = V[0], Y = V[1]; } if (X <= T && T <= Y) ans = md, en = md - 1; else st = md + 1; } 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...