제출 #730408

#제출 시각아이디문제언어결과실행 시간메모리
730408tch1cherinRailway Trip 2 (JOI22_ho_t4)C++17
52 / 100
2047 ms39552 KiB
#include <bits/stdc++.h> using namespace std; struct Event { int modl, modr, type; Event() {} Event(int _modl, int _modr, int _type) : modl(_modl), modr(_modr), type(_type) {} }; void solve() { int N, K; cin >> N >> K; int M; cin >> M; vector<int> A(M), B(M); for (int i = 0; i < M; i++) { cin >> A[i] >> B[i]; A[i]--, B[i]--; } vector<vector<Event>> events(N); for (int i = 0; i < M; i++) { if (A[i] < B[i]) { events[A[i]].emplace_back(N, B[i], 1); events[min(A[i] + K - 1, B[i])].emplace_back(N, B[i], -1); } else { events[max(A[i] - K + 1, B[i])].emplace_back(B[i], -1, 1); events[A[i]].emplace_back(B[i], -1, -1); } } vector<int> L(N), R(N); multiset<int> sl, sr; for (int i = 0; i < N; i++) { L[i] = i, R[i] = i; for (auto [modl, modr, type] : events[i]) { if (type == 1) { sl.insert(modl); sr.insert(modr); } } if (!sl.empty()) { L[i] = min(L[i], *sl.begin()); R[i] = max(R[i], *sr.rbegin()); } for (auto [modl, modr, type] : events[i]) { if (type == -1) { sl.erase(sl.find(modl)); sr.erase(sr.find(modr)); } } } if (K == N - 1) { vector<vector<int>> nxt(N, vector<int>(20)), lst(N, vector<int>(20)); for (int i = 0; i < N; i++) { lst[i][0] = L[i]; nxt[i][0] = R[i]; } for (int i = 0; i < N; i++) { for (int j = 0; j + 1 < 20; j++) { lst[i][j + 1] = lst[lst[i][j]][j]; } } for (int i = N - 1; i >= 0; i--) { for (int j = 0; j + 1 < 20; j++) { nxt[i][j + 1] = nxt[nxt[i][j]][j]; } } int Q; cin >> Q; while (Q--) { int S, T; cin >> S >> T; S--, T--; int ans = 0; if (S < T) { for (int i = 20 - 1; i >= 0; i--) { if (nxt[S][i] < T) { ans += (1 << i); S = nxt[S][i]; } } } else { for (int i = 20 - 1; i >= 0; i--) { if (lst[S][i] > T) { ans += (1 << i); S = lst[S][i]; } } } cout << (ans == (1 << 20) - 1 ? -1 : ans + 1) << "\n"; } return; } int Q; cin >> Q; while (Q--) { int S, T; cin >> S >> T; S--, T--; queue<int> q; set<int> unvisited; for (int i = 0; i < N; i++) { if (i != S) { unvisited.insert(i); } } vector<int> dist(N, N); dist[S] = 0; q.push(S); while (!q.empty()) { int u = q.front(); q.pop(); auto it = unvisited.lower_bound(L[u]); while (it != unvisited.end() && *it <= R[u]) { dist[*it] = dist[u] + 1; q.push(*it); it = next(it); unvisited.erase(prev(it)); } } cout << (dist[T] == N ? -1 : dist[T]) << "\n"; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }
#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...