Submission #735556

#TimeUsernameProblemLanguageResultExecution timeMemory
735556vjudge1Jakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
121 ms262144 KiB
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> a(m), b(m); for (int i = 0; i < m; i++) cin >> a[i] >> b[i]; int sn = sqrt(n * __lg(n)) + 1; vector<vector<int64_t>> d(n, vector<int64_t>(sn + 1, 9e18)); vector<vector<vector<tuple<int, int, int>>>> adj(n, vector<vector<tuple<int, int, int>>>(sn + 1)); for (int i = 0; i < m; i++) { if (b[i] < sn) { adj[a[i]][sn].emplace_back(a[i], b[i], 0); } else { for (int j = a[i] % b[i]; j < n; j += b[i]) { adj[a[i]][sn].emplace_back(j, sn, abs(a[i] - j) / b[i]); } } } d[a[0]][sn] = 0; priority_queue<tuple<int64_t, int, int>> pq; pq.emplace(0, a[0], sn); while (pq.size()) { auto [du, u, s] = pq.top(); pq.pop(); if (d[u][s] != -du) continue; du = -du; if (u == a[1]) return cout << du, 0; if (s != sn && u - s >= 0) { int uu = u - s, ss = s, c = 1; if (d[uu][ss] > du + c) { d[uu][ss] = du + c; pq.emplace(-d[uu][ss], uu, ss); } ss = sn; if (d[uu][ss] > du + c) { d[uu][ss] = du + c; pq.emplace(-d[uu][ss], uu, ss); } } if (s != sn && u + s < n) { int uu = u + s, ss = s, c = 1; if (d[uu][ss] > du + c) { d[uu][ss] = du + c; pq.emplace(-d[uu][ss], uu, ss); } ss = sn; if (d[uu][ss] > du + c) { d[uu][ss] = du + c; pq.emplace(-d[uu][ss], uu, ss); } } for (auto [uu, ss, c] : adj[u][s]) { if (d[uu][ss] > du + c) { d[uu][ss] = du + c; pq.emplace(-d[uu][ss], uu, ss); } } } cout << -1; }
#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...