제출 #1187326

#제출 시각아이디문제언어결과실행 시간메모리
1187326WarinchaiJakarta Skyscrapers (APIO15_skyscraper)C++20
22 / 100
90 ms144980 KiB
#include<bits/stdc++.h> using namespace std; map<pair<short,short>,vector<short>>mp; vector<int>up[30005]; vector<int> down1[2000005],down2[2000005],hor[2000005]; 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(int i=0;i<=2e6;i++)down1[i]=down2[i]=hor[i]=-1; for(auto x:mp){ int cur=x.first.first; int p=x.first.second; for(auto b:x.second)up[b].push_back(id+(b-cur)/p+1); for(cur;cur<n;cur+=p){ id++; if(have[cur])down1[id].push_back(cur); if(cur!=x.first.first)hor[id].push_back(id-1); } cur=x.first.first; for(auto b:x.second)up[b].push_back(id+(b-cur)/p+1); for(cur;cur<n;cur+=p){ id++; if(have[cur])down2[id].push_back(cur); if(cur!=x.first.first)hor[id-1].push_back(id); } } 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 x:up[u])dq.push_front({d,x}); for(auto x:down1[u])dq.push_front({d,x}); for(auto x:down2[u])dq.push_front({d,x}); for(auto x:hor[u])dq.push_back({d+1,x}); /*if(down1[u]!=-1)dq.push_front({d,down1[u]}); if(down2[u]!=-1)dq.push_front({d,down2[u]}); if(hor[u]!=-1)dq.push_back({d+1,hor[u]});*/ } 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...