제출 #954934

#제출 시각아이디문제언어결과실행 시간메모리
954934colossal_pepeJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
702 ms27860 KiB
#include <iostream> #include <vector> #include <queue> #include <tuple> 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<vector<int>> &dist, priority_queue<tuple<int, int, int>> &q) { if (p[i] < BLK and -d < dist[pos][p[i]]) { dist[pos][p[i]] = -d; q.push(make_tuple(d, pos, p[i])); } else if (p[i] >= BLK) { int l = b[i] - p[i], r = b[i] + p[i], x = 1; while (l >= 0 or r < n) { if (l >= 0 and -d + x < dist[l][0]) { dist[l][0] = -d + x; q.push(make_tuple(d - x, l, 0)); } if (r < n and -d + x < dist[r][0]) { dist[r][0] = -d + x; q.push(make_tuple(d - x, r, 0)); } l -= p[i]; r += p[i]; x++; } } } int solve() { vector<vector<int>> dist(n, vector<int>(BLK, INF)); priority_queue<tuple<int, int, int>> q; dist[b[0]][p[0]] = 0; q.push(make_tuple(0, b[0], p[0])); while (not q.empty()) { auto [d, pos, power] = q.top(); q.pop(); if (dist[pos][power] != -d) continue; while (not v[pos].empty()) { int i = v[pos].back(); addDoge(i, pos, d, dist, q); v[pos].pop_back(); } if (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 (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]][i]); } 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); cin >> b[0] >> p[0]; for (int i = 1; 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...