Submission #954926

#TimeUsernameProblemLanguageResultExecution timeMemory
954926colossal_pepeJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
906 ms3532 KiB
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; const int BLK = 200; int n, m; vector<int> b, p; vector<vector<int>> v; void addDoge(int i, int pos, int d, vector<int> &dist, priority_queue<pair<int, int>> &q, bool dir) { int c = (dir ? 1 : -1); for (int pos_nxt = pos + c * p[i], x = 1; (dir ? pos_nxt < n : pos_nxt >= 0); pos_nxt += c * p[i], x++) { if (-d + x < dist[pos_nxt]) { dist[pos_nxt] = -d + x; q.push({d - x, pos_nxt}); } } } int solve() { vector<int> dist(n, INF); priority_queue<pair<int, int>> q; dist[b[0]] = 0; q.push({0, b[0]}); while (not q.empty()) { auto [d, pos] = q.top(); q.pop(); if (dist[pos] != -d) continue; while (not v[pos].empty()) { addDoge(v[pos].back(), pos, d, dist, q, 0); addDoge(v[pos].back(), pos, d, dist, q, 1); v[pos].pop_back(); } // if (power and pos + power < n and -d + 1 < dist[pos + power][power]) { // dist[pos + power][power] = -d + 1; // q.push(make_tuple(d - 1, pos + power, power)); // } // if (power and pos - power >= 0 and -d + 1 < dist[pos - power][power]) { // dist[pos - power][power] = -d + 1; // q.push(make_tuple(d - 1, pos - power, power)); // } } int ret = INF; for (int i = 0; i < BLK; i++) { ret = min(ret, dist[b[1]]); } return ret == INF ? -1 : ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; v.resize(n), b.resize(m), p.resize(m); for (int i = 0; i < m; i++) { cin >> b[i] >> p[i]; v[b[i]].push_back(i); } cout << solve() << '\n'; 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...