제출 #110983

#제출 시각아이디문제언어결과실행 시간메모리
110983square1001Jakarta Skyscrapers (APIO15_skyscraper)C++14
0 / 100
3 ms384 KiB
#include <set> #include <ctime> #include <deque> #include <vector> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; int N, M, B[30009], P[30009], dist[7500000], sep[7500000]; pair<int, int> e[22500000]; int main() { cin.tie(0); ios_base::sync_with_stdio(false); cin >> N >> M; for(int i = 0; i < M; ++i) { cin >> B[i] >> P[i]; } int sum = 0; set<pair<int, int> > s; for(int i = 0; i < M; ++i) { pair<int, int> u = make_pair(B[i] % P[i], P[i]); if(s.find(u) == s.end()) { sum += ((N - 1) - B[i] % P[i] + P[i]) / P[i]; s.insert(u); } } unordered_map<int, int> d; int cnt = N, E = 0; for(pair<int, int> i : s) { for(int j = i.first; j < N; j += i.second) { d[i.second * N + j] = cnt++; } } for(int i = 0; i < M; ++i) { e[E++] = make_pair(B[i], d[P[i]] * N + B[i]); } sort(e, e + M); cnt = N; for(pair<int, int> i : s) { for(int j = i.first; j < N; j += i.second) { if(j != i.first) { e[E++] = make_pair(cnt - 1, cnt); e[E++] = make_pair(cnt, cnt - 1); } e[E++] = make_pair(cnt++, j); } } for(int i = 0; i < E; ++i) { sep[e[i].first + 1] = i + 1; } for(int i = 1; i <= sum; ++i) { sep[i] = max(sep[i], sep[i - 1]); } fill(dist, dist + N + sum, -1); dist[B[0]] = 0; deque<int> que; que.push_back(B[0]); while(!que.empty()) { int u = que.front(); que.pop_front(); for(int i = sep[u]; i < sep[u + 1]; ++i) { int tar = e[i].second; if(dist[tar] != -1) continue; if(u < N || tar < N) dist[tar] = dist[u], que.push_front(tar); else dist[tar] = dist[u] + 1, que.push_back(tar); } } cout << dist[B[1]] << endl; 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...