Submission #206184

#TimeUsernameProblemLanguageResultExecution timeMemory
206184mraronJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
634 ms11496 KiB
#include<bits/stdc++.h> using namespace std; #define xx first #define yy second int n,m; const int MAXN=30001; const int lim=50; int b[MAXN]; int p[MAXN]; int dst[MAXN][lim+1]; int kesz[MAXN]; vector<int> lst_small[MAXN]; vector<int> lst_big[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]; if(p[i]<=lim) lst_small[b[i]].push_back(p[i]); else lst_big[b[i]].push_back(p[i]); } for(int i=0;i<n;++i) { lst_small[b[i]].push_back(0); sort(lst_small[b[i]].begin(), lst_small[b[i]].end()); lst_small[b[i]].resize(distance(lst_small[b[i]].begin(), unique(lst_small[b[i]].begin(), lst_small[b[i]].end()))); sort(lst_big[b[i]].begin(), lst_big[b[i]].end()); lst_big[b[i]].resize(distance(lst_big[b[i]].begin(), unique(lst_big[b[i]].begin(), lst_big[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 ; if(!kesz[tp.yy.xx]) { for(auto i:lst_small[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}}); } } } for(auto i:lst_big[tp.yy.xx]) { 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}}); } } } } kesz[tp.yy.xx]=1; 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...