Submission #110988

#TimeUsernameProblemLanguageResultExecution timeMemory
110988square1001Jakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1088 ms103048 KiB
#include <set> #include <ctime> #include <vector> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; int N, M, ql, qr, B[30009], P[30009], dist[7500000], sep[7500000], que[22500009]; 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; que[qr++] = B[0]; while(ql != qr) { int u = que[ql++]; 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[--ql] = tar; else dist[tar] = dist[u] + 1, que[qr++] = 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...