Submission #1110693

#TimeUsernameProblemLanguageResultExecution timeMemory
1110693haru09Jakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
139 ms47160 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second const int ar = 5e4 + 5; const ll mod = 1e9 + 7; int n, m; int sqr; int b[ar]; int p[ar]; int dp[ar][226]; vector<int> ad[ar]; struct seg { int dis, i, p; }; bool operator>(seg a, seg b) { return a.dis > b.dis; } queue<seg> pq; int ans = 1e9; void dijkstra() { memset(dp, 0x3f, sizeof dp); pq.push({0, b[0], 0}); dp[b[0]][0] = 0; while(pq.size()) { seg top = pq.front(); pq.pop(); int dis = top.dis; int i = top.i; int pk = top.p; if (dp[i][pk] < dis) continue; if (i == b[1]) ans = min(ans, dis); if (pk == 0) { for (auto x : ad[i]) { if (p[x] <= sqr) { if (dp[i][p[x]] > dis) { dp[i][p[x]] = dis; pq.push({dis, i, p[x]}); } } else { int cnt = 0; for (int j = i; j < n; j += p[x]) { if (dp[j][0] > dis + cnt) { dp[j][0] = dis + cnt; pq.push({dp[j][0], j, 0}); } cnt++; } cnt = 0; for (int j = i; j >= 0; j -= p[x]) { if (dp[j][0] > dis + cnt) { dp[j][0] = dis + cnt; pq.push({dp[j][0], j, 0}); } cnt++; } } } } else { if (i + pk < n && dp[i + pk][pk] > dis + 1) { dp[i + pk][pk] = dis + 1; pq.push({dp[i + pk][pk], i + pk, pk}); } if (i - pk >= 0 && dp[i - pk][pk] > dis + 1) { dp[i - pk][pk] = dis + 1; pq.push({dp[i - pk][pk], i - pk, pk}); } if (dp[i][0] > dis) { dp[i][0] = dis; pq.push({dp[i][0], i, 0}); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 0; i < m; i++) { cin >> b[i] >> p[i]; ad[b[i]].push_back(i); } sqr = 225; dijkstra(); if (ans == 1e9) ans = -1; cout << ans; }
#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...