제출 #847144

#제출 시각아이디문제언어결과실행 시간메모리
847144danglayloi1Jakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
398 ms23768 KiB
#include <bits/stdc++.h> #define fi first #define se second #define inf 0x3f3f3f3f using namespace std; using ll = long long; const int nx=3e4+5; const int sq=175; int n, m, d[nx][sq], b[nx], p[nx], ans=inf; vector<int> city[nx]; struct dak { int i, w, p; bool operator <(const dak &o) const { return w>o.w; } }; priority_queue<dak> f; 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]; city[b[i]].emplace_back(i); } memset(d, 0x3f, sizeof(d)); d[b[0]][0]=0; f.push({b[0], 0, 0}); while(f.size()) { dak v=f.top(); f.pop(); int u=v.i, w=v.w, pw=v.p; if(u==b[1]) ans=min(ans, w); if(w!=d[u][pw]) continue; if(!pw) { for(int i:city[u]) { if(p[i]<sq) { if(d[u][p[i]]>w) { d[u][p[i]]=w; f.push({u, w, p[i]}); } } else { for(int j = u%p[i]; j < n; j+=p[i]) { if(d[j][0]>w+abs(u-j)/p[i]) { d[j][0]=w+abs(u-j)/p[i]; f.push({j, d[j][0], 0}); } } } } } else { if(u+pw<n && d[u+pw][pw]>w+1) { d[u+pw][pw]=w+1; f.push({u+pw, w+1, pw}); } if(u-pw>=0 && d[u-pw][pw]>w+1) { d[u-pw][pw]=w+1; f.push({u-pw, w+1, pw}); } if(d[u][0]>w) { d[u][0]=w; f.push({u, w, 0}); } } } if(ans==inf) 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...