Submission #110977

#TimeUsernameProblemLanguageResultExecution timeMemory
110977square1001Jakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1056 ms154512 KiB
#include <set> #include <deque> #include <vector> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; int main() { int N, M; cin >> N >> M; vector<int> B(M), P(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); } } vector<vector<int> > G(N + sum); unordered_map<int, int> d; int cnt = N; for(pair<int, int> i : s) { for(int j = i.first; j < N; j += i.second) { d[i.second * N + j] = cnt; G[cnt].push_back(j); if(j != i.first) { G[cnt].push_back(cnt - 1); G[cnt - 1].push_back(cnt); } ++cnt; } } for(int i = 0; i < M; ++i) { G[B[i]].push_back(d[P[i] * N + B[i]]); } vector<int> 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 : G[u]) { if(dist[i] != -1) continue; if(u < N || i < N) dist[i] = dist[u], que.push_front(i); else dist[i] = dist[u] + 1, que.push_back(i); } } 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...