Submission #636883

#TimeUsernameProblemLanguageResultExecution timeMemory
636883classicJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
818 ms29504 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vector<int> b(m), p(m); vector<vector<int>> doge(n + 1); for (int i = 0; i < m; i++) { cin >> b[i] >> p[i]; doge[b[i]].emplace_back(i); } priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq; pq.push({0, {b[0], 0}}); vector<vector<int>> dist(n, vector<int>(200, 1e9)); dist[b[0]][0] = 0; int limit = (int)sqrt(n); int res = 1e9; while (!pq.empty()) { pair<int, pair<int, int>> cur = pq.top(); pq.pop(); int du = cur.first; int u = cur.second.first; if (u == b[1]) { res = min(res, du); } int pu = cur.second.second; if (pu == 0) { for (int id : doge[u]) { if (p[id] <= limit) { // nsqrt(n) if (dist[u][p[id]] > du) { dist[u][p[id]] = du; pq.push({du, {u, p[id]}}); } } else { // msqrt(n) int pv = p[id]; for (int j = 1; u - j * pv >= 0; j++) { int v = u - j * pv; int dv = du + j; if (dist[v][0] > dv) { dist[v][0] = dv; pq.push({dv, {v, 0}}); } } for (int j = 1; u + j * pv < n; j++) { int v = u + j * pv; int dv = du + j; if (dist[v][0] > dv) { dist[v][0] = dv; pq.push({dv, {v, 0}}); } } } } } else { if (dist[u][0] > du) { // nsqrt(n) dist[u][0] = du; pq.push({dist[u][0], {u, 0}}); } // 2nsqrt(n) if (u + pu < n && dist[u + pu][pu] > dist[u][pu] + 1) { int dv = dist[u][pu] + 1; int v = u + pu; dist[v][pu] = dist[u][pu] + 1; pq.push({dv, {v, pu}}); } if (u - pu >= 0 && dist[u - pu][pu] > dist[u][pu] + 1) { int dv = dist[u][pu] + 1; int v = u - pu; dist[v][pu] = dist[u][pu] + 1; pq.push({dv, {v, pu}}); } } } cout << (res == 1e9 ? -1 : res); 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...