제출 #1233970

#제출 시각아이디문제언어결과실행 시간메모리
1233970AMel0nJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
64 ms6272 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define FOR(i,N) for(ll i = 0; i < N; i++) #define all(x) (x).begin(), (x).end() // #define F first // #define S second int N, M, start, endd; unordered_set<int> B[30005]; // building -> power of doge inside int vis[30005]; signed main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N >> M; fill(vis, vis+N, 1e9); FOR(i, M) { int b, p; cin >> b >> p; B[b].insert(p); if (i == 0) start = b; if (i == 1) endd = b; } priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; pq.push({0, start}); vis[start] = 0; while(pq.size()) { auto [dist, u] = pq.top(); pq.pop(); // cout << dist << ' ' << u << ' '<< vis[u] << endl; if (vis[u] != dist) continue; if (u == endd) { cout << dist; return 0; } for(int dog: B[u]) { for(int v = u - dog; v >= 0; v -= dog) { if (dist + (u - v) / dog < vis[v]) { pq.push({dist + (u - v) / dog, v}); vis[v] = dist + (u - v) / dog; } if (B[v].find(dog) != B[v].end()) break; } for(int v = u + dog; v < N; v += dog) { if (dist + (v - u) / dog < vis[v]) { pq.push({dist + (v - u) / dog, v}); vis[v] = dist + (v - u) / dog; } if (B[v].find(dog) != B[v].end()) break; } } } 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...