제출 #1187287

#제출 시각아이디문제언어결과실행 시간메모리
1187287WarinchaiJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
193 ms263764 KiB
#include<bits/stdc++.h> using namespace std; map<pair<short,short>,vector<short>>mp; vector<pair<int,bool>>adj[5000005]; vector<int>dis; int inf=1e9; int have[30005]; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,m;cin>>n>>m; int st=0,en=0; for(int i=0;i<m;i++){ int b,p;cin>>b>>p; if(i==0)st=b; if(i==1)en=b; if(i!=1)mp[{b%p,p}].push_back(b); have[b]++; } int id=n-1; for(auto x:mp){ int cur=x.first.first; int p=x.first.second; for(auto b:x.second)adj[b].push_back({id+(b-cur)/p+1,0}); for(cur;cur<n;cur+=p){ id++; if(have[cur])adj[id].push_back({cur,0}); if(cur!=x.first.first)adj[id-1].push_back({id,1}); } cur=x.first.first; for(auto b:x.second)adj[b].push_back({id+(b-cur)/p+1,0}); for(cur;cur<n;cur+=p){ id++; if(have[cur])adj[id].push_back({cur,0}); if(cur!=x.first.first)adj[id].push_back({id-1,1}); } } assert(id<2e6); dis.resize(id+1,inf); mp.clear(); deque<pair<int,int>>dq; dq.push_back({0,st}); while(!dq.empty()){ auto [d,u]=dq.front(); assert(u<2e6); dq.pop_front(); if(d>=dis[u])continue; dis[u]=d; assert(u<2e6); if(u==en)break; for(auto v:adj[u]){ assert(v.first<2e6); if(v.second+d>=dis[v.first])continue; if(v.second)dq.push_back({d+1,v.first}); else dq.push_front({d,v.first}); } } if(dis[en]==inf)cout<<-1; else cout<<dis[en]; }
#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...