제출 #206176

#제출 시각아이디문제언어결과실행 시간메모리
206176mraronJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1093 ms26040 KiB
#include<bits/stdc++.h> using namespace std; #define xx first #define yy second int n,m; const int MAXN=30001; const int lim=200; int b[MAXN]; int p[MAXN]; int dst[MAXN][lim+1]; vector<int> lst[MAXN]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=0;i<m;++i) { cin>>b[i]>>p[i]; lst[b[i]].push_back(p[i]); } for(int i=0;i<n;++i) { lst[b[i]].push_back(0); sort(lst[b[i]].begin(), lst[b[i]].end()); lst[b[i]].resize(distance(lst[b[i]].begin(), unique(lst[b[i]].begin(), lst[b[i]].end()))); } for(int i=0;i<n;++i) { for(int j=0;j<=lim;++j) { dst[i][j]=1e9; } } dst[b[0]][0]=0; priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>> pq; pq.push({0, {b[0], 0}}); while(!pq.empty()) { auto tp=pq.top(); pq.pop(); if(tp.xx>dst[tp.yy.xx][tp.yy.yy]) continue ; for(auto i:lst[tp.yy.xx]) { if(i<=lim) { if(tp.xx<dst[tp.yy.xx][i]) { dst[tp.yy.xx][i]=tp.xx; pq.push({dst[tp.yy.xx][i], {tp.yy.xx, i}}); } }else { for(int j=tp.yy.xx%i;j<n;j+=i) { int diff=abs(j-tp.yy.xx)/i; if(tp.xx+diff<dst[j][0]) { dst[j][0]=tp.xx+diff; pq.push({dst[j][0], {j,0}}); } } } } if(tp.yy.xx-tp.yy.yy>=0 && tp.xx+1<dst[tp.yy.xx-tp.yy.yy][tp.yy.yy]) { dst[tp.yy.xx-tp.yy.yy][tp.yy.yy]=tp.xx+1; pq.push({dst[tp.yy.xx-tp.yy.yy][tp.yy.yy], {tp.yy.xx-tp.yy.yy, tp.yy.yy}}); } if(tp.yy.xx+tp.yy.yy<n && tp.xx+1<dst[tp.yy.xx+tp.yy.yy][tp.yy.yy]) { dst[tp.yy.xx+tp.yy.yy][tp.yy.yy]=tp.xx+1; pq.push({dst[tp.yy.xx+tp.yy.yy][tp.yy.yy], {tp.yy.xx+tp.yy.yy, tp.yy.yy}}); } } if(dst[b[1]][0]==1e9) cout<<-1; else cout<<dst[b[1]][0]; cout<<"\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...