Submission #109920

#TimeUsernameProblemLanguageResultExecution timeMemory
109920SaboonJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1090 ms138728 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 30000 + 10; const int inf = 1e9; const int T = 70; int b[maxn], p[maxn], dp[maxn * T]; int n, m; vector<pair<int, int> > g[maxn * T]; int id(int v, int x){ return v * T + x; } void dijkstra(int v){ for (int i = 0; i < n * T; i++) dp[i] = inf; dp[v] = 0; set<pair<int, int> > s; for (int i = 0; i < n * T; i++) s.insert({dp[i], i}); while (!s.empty()){ int v = (*s.begin()).second; s.erase(s.begin()); for (auto edge : g[v]){ int u = edge.first, w = edge.second; if (dp[u] > dp[v] + w){ s.erase({dp[u], u}); dp[u] = dp[v] + w; s.insert({dp[u], u}); } } } } int main(){ ios_base::sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < m; i++){ cin >> b[i] >> p[i]; if (p[i] < T) g[id(b[i], 0)].push_back({id(b[i], p[i]), 0}); else{ for (int u = b[i] + p[i]; u < n; u += p[i]) g[id(b[i], 0)].push_back({id(u, 0), (u - b[i]) / p[i]}); for (int u = b[i] - p[i]; u >= 0; u -= p[i]) g[id(b[i], 0)].push_back({id(u, 0), (b[i] - u) / p[i]}); } } for (int i = 0; i < n; i++){ for (int j = 1; j < T; j++){ g[id(i, j)].push_back({id(i, 0), 0}); if (i + j < n) g[id(i, j)].push_back({id(i + j, j), 1}); if (i - j >= 0) g[id(i, j)].push_back({id(i - j, j), 1}); } } dijkstra(id(b[0], 0)); if (dp[id(b[1], 0)] == inf) dp[id(b[1], 0)] = -1; cout << dp[id(b[1], 0)] << '\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...