Submission #635292

#TimeUsernameProblemLanguageResultExecution timeMemory
635292ljubaJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
182 ms68080 KiB
#include <bits/stdc++.h> #include <queue> #include <vector> using namespace std; using ll = long long; const int INF = 1e9 + 12; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<pair<int, int>> v(m); for(auto &z : v) cin >> z.first >> z.second; set<pair<int, int>> where[n]; for(auto z : v) { where[z.first].insert(z); } vector<pair<int, int>> adj[n]; for(int i = 0; i < n; ++i) { for(auto z : where[i]) { if(z.second == 0) continue; for(int j = 1; j < n; ++j) { int nx = j * z.second + i; if(nx >= n) break; adj[i].push_back({nx, j}); if(where[nx].count({nx, z.second})) break; } for(int j = 1; j < n; ++j) { int nx = -j * z.second + i; if(nx < 0) break; adj[i].push_back({nx, j}); if(where[nx].count({nx, z.second})) break; } } } // for(int i = 0; i < n; ++i) { // cerr << i << ": "; // for(auto z : adj[i]) { // cerr << "{" << z.first << ", " << z.second << "}"; // cerr << ", "; // } // cerr << endl; // } auto calc = [&](int start, int end) { vector<int> dist(n, INF); dist[start] = 0; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq; pq.push({0, start}); while(!pq.empty()) { auto tren = pq.top(); pq.pop(); if(dist[tren.second] != tren.first) continue; for(auto e : adj[tren.second]) { if(dist[e.first] > dist[tren.second] + e.second) { dist[e.first] = dist[tren.second] + e.second; pq.push({dist[e.first], e.first}); } } } return dist[end]; }; int ans = calc(v[0].first, v[1].first); cout << (ans >= INF ? -1 : ans) << '\n'; }
#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...