Submission #604463

#TimeUsernameProblemLanguageResultExecution timeMemory
604463JomnoiEvent Hopping (BOI22_events)C++17
10 / 100
1597 ms14688 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5 + 5; const int MAX_M = 5005; const int INF = 1e9 + 7; int S[MAX_N], E[MAX_N]; int dist[MAX_N]; int can_reach[MAX_M][MAX_M]; vector <int> graph[MAX_N]; int nxt[MAX_N][20]; int main() { cin.tie(nullptr)->sync_with_stdio(false); int N, Q; cin >> N >> Q; for(int i = 1; i <= N; i++) { cin >> S[i] >> E[i]; } if(N <= 1000 and Q <= 100) { for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { if(i != j and S[j] <= E[i] and E[i] <= E[j]) { graph[i].push_back(j); } } } for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { dist[j] = -1; } queue <int> q; q.push(i); dist[i] = 0; while(!q.empty()) { int u = q.front(); q.pop(); for(auto v : graph[u]) { if(dist[v] == -1) { dist[v] = dist[u] + 1; q.push(v); } } } for(int j = 1; j <= N; j++) { can_reach[i][j] = dist[j]; } } while(Q--) { int s, e; cin >> s >> e; if(can_reach[s][e] == -1) { cout << "impossible\n"; } else { cout << can_reach[s][e] << '\n'; } } } else { vector <pair <int, int>> vec; for(int i = 1; i <= N; i++) { vec.emplace_back(E[i], S[i]); } sort(vec.begin(), vec.end()); for(int l = 0, r = 0; l < N; r++) { while(r < N and vec[l].first < vec[r].second) { r++; } if(r < N) { nxt[l][0] = r; } } for(int j = 1; j < 20; j++) { for(int i = 0; i < N; i++) { nxt[i][j] = nxt[nxt[i][j - 1]][j - 1]; } } while(Q--) { int s, e; cin >> s >> e; int ps = lower_bound(vec.begin(), vec.end(), make_pair(E[s], S[s])) - vec.begin(); int pe = lower_bound(vec.begin(), vec.end(), make_pair(E[e], S[e])) - vec.begin(); int ans = 0; for(int i = 19; i >= 0; i--) { if(nxt[ps][i] <= pe) { ps = nxt[ps][i]; ans += (1<<i); } } if(ps == pe) { cout << ans << '\n'; } else { cout << "impossible\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...