제출 #260828

#제출 시각아이디문제언어결과실행 시간메모리
260828jeqchoJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
1085 ms3444 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef vector<int> vi; typedef vector<pair<int,int>> vpi; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define F0R(i,a) FOR(i,0,a) #define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i) #define R0F(i,a) ROF(i,0,a) #define trav(a,x) for (auto& a: x) #define pb push_back #define rsz resize #define sz(x) int(x.size()) #define all(x) begin(x), end(x) #define f first #define s second int N,M; int const m=3e4, n=3e4; int B[m]; int P[m]; vi sky[n]; int dist[m]; priority_queue<pii>q; bitset<m> pro; void activate(int now, vpi &adjnow) { if(now==0) { trav(e,sky[B[0]]) { if(e==0)continue; adjnow.pb({e,0}); } } for(int i=1; B[now]+i*P[now]<N; ++i) { trav(e,sky[B[now]+i*P[now]]) { if(pro[e])continue; adjnow.pb({e,i}); } } for(int i=-1; B[now]+i*P[now]>=0; --i) { trav(e,sky[B[now]+i*P[now]]) { if(pro[e])continue; adjnow.pb({e,-i}); } } } void dij(int x) { dist[x]=0; q.push({0,x}); int b,w; vpi adjnow; while(!q.empty()) { int a = q.top().s; q.pop(); if(pro[a])continue; pro[a]=1; if(a==1)return; adjnow.clear(); activate(a, adjnow); trav(e, adjnow) { b=e.f; w=e.s; if(dist[a]+w<dist[b]) { dist[b]=dist[a]+w; q.push({-dist[b],b}); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>N>>M; F0R(i,M) { cin>>B[i]>>P[i]; sky[B[i]].pb(i); } int INF=1e9; F0R(now,M) { dist[now]=INF; } dij(0); if(dist[1]==INF)cout<<-1<<'\n'; else cout<<dist[1]<<'\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...