제출 #599112

#제출 시각아이디문제언어결과실행 시간메모리
599112SlavicGEvent Hopping (BOI22_events)C++17
40 / 100
1577 ms123040 KiB
#include "bits/stdc++.h" using namespace std; const int N = 1e6 + 10; int l[N], r[N], n, q; vector<int> events[N]; vector<int> go(int start) { queue<int> q; vector<bool> closed(n, false); q.push(start); vector<int> dist(n, -1); dist[start] = 0; for(int i = r[start]; i >= 0; --i) { while(!q.empty() && closed[q.front()]) q.pop(); for(int e: events[i]) { if(e == start) continue; if(e < 0) continue; if(!q.empty()) { dist[e] = dist[q.front()] + 1; q.push(e); } } for(int e: events[i]) { if(e >= 0) continue; int idx = -e - 1; closed[idx] = true; } } return dist; } int main() { vector<int> v; cin >> n >> q; for(int i = 0; i < n; ++i) { cin >> l[i] >> r[i]; v.push_back(l[i]); v.push_back(r[i]); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); for(int i = 0; i < n; ++i) { l[i] = lower_bound(v.begin(), v.end(), l[i]) - v.begin(); r[i] = lower_bound(v.begin(), v.end(), r[i]) - v.begin(); events[r[i]].push_back(i); events[l[i]].push_back(-i - 1); } if(n <= 5000) { vector<vector<int>> dist; for(int i = 0; i < n; ++i) dist.push_back(go(i)); while(q--) { int a, b; cin >> a >> b; --a, --b; if(dist[b][a] == -1) cout << "impossible\n"; else cout << dist[b][a] << "\n"; } } else { while(q--) { int a, b; cin >> a >> b; --a, --b; vector<int> dist = go(b); if(dist[a] == -1) cout << "impossible\n"; else cout << dist[a] << "\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...