제출 #89285

#제출 시각아이디문제언어결과실행 시간메모리
89285Mouhanad_HafezJakarta Skyscrapers (APIO15_skyscraper)C++11
100 / 100
126 ms20316 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; int N, M, S, E; int D[30005]; bool V[30005][200]; vector <int> doge[30005]; int main() { cin>>N>>M; for (int i=0;i<M;i++){ int b, p; cin>>b>>p; if (p > 199 || !V[b][p]) doge[b].push_back(p); if (p < 200) V[b][p] = 1; if (!i) S = b; if (i == 1) E = b; } for (int i=0;i<N;i++) D[i] = 2e9; priority_queue <pii> que; D[S] = 0; que.push(make_pair(0, S)); while (!que.empty()){ int q = que.top().second, d = -que.top().first; que.pop(); if (D[q] != d) continue; for (int p: doge[q]){ for (int i=q-p;i>=0;i-=p){ if (D[i] > d+(q-i)/p) D[i] = d+(q-i)/p, que.push(make_pair(-D[i], i)); if (p < 200 && V[i][p]) break; if (p < 200) V[i][p] = 1; } for (int i=q+p;i<N;i+=p){ if (D[i] > d+(i-q)/p) D[i] = d+(i-q)/p, que.push(make_pair(-D[i], i)); if (p < 200 && V[i][p]) break; if (p < 200) V[i][p] = 1; } } } if (D[E]<2e9)cout<<D[E]; else cout<<-1; 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...