Submission #45377

#TimeUsernameProblemLanguageResultExecution timeMemory
45377JohnTitorJakarta Skyscrapers (APIO15_skyscraper)C++11
100 / 100
824 ms35464 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, j, k) for(int i=(j); i<=(k); i++) #define FFOR(i, j, k) for(int i=(j); i<(k); i++) #define DFOR(i, j, k) for(int i=(j); i>=(k); i--) #define bug(x) cerr<<#x<<" = "<<(x)<<'\n' #define pb push_back #define mp make_pair #define setbit(s, i) (s|=(1LL<<(i))) #define bit(s, i) (((s)>>(i))&1LL) #define mask(i) ((1LL<<(i))) #define builtin_popcount __builtin_popcountll typedef long long ll; typedef long double ld; template <typename T> inline void read(T &x){ char c; bool nega=0; while((!isdigit(c=getchar()))&&(c!='-')); if(c=='-'){ nega=1; c=getchar(); } x=c-48; while(isdigit(c=getchar())) x=x*10+c-48; if(nega) x=-x; } template <typename T> inline void writep(T x){ if(x>9) writep(x/10); putchar(x%10+48); } template <typename T> inline void write(T x){ if(x<0){ putchar('-'); x=-x; } writep(x); } template <typename T> inline void writeln(T x){ write(x); putchar('\n'); } #define taskname "Jakarta_Skyscrapers" int n, m; int b[30001]; int p[30001]; vector <int> big[30001]; vector <int> small[30001]; int f[30001][176]; int sq=175; class data{ public: int u, s, d; data(){} data(int _u, int _s, int _d){ u=_u; s=_s; d=_d; } }; class cmp{ public: bool operator ()(data a, data b){ return a.d>b.d; } }; priority_queue <data, vector <data>, cmp> q; const int inf=mask(30); void dij(){ FOR(i, 0, n) FOR(j, 0, sq) f[i][j]=inf; f[b[0]][0]=0; q.push(data(b[0], 0, 0)); data t; while(!q.empty()){ t=q.top(); q.pop(); if(t.d>f[t.u][t.s]) continue; // cerr<<t.u<<" "<<t.s<<" "<<t.d<<'\n'; if(t.s){///can move if(t.u-t.s>=0){ if(f[t.u-t.s][t.s]>t.d+1){ f[t.u-t.s][t.s]=t.d+1; q.push(data(t.u-t.s, t.s, t.d+1)); } } if(t.u+t.s<n){ if(f[t.u+t.s][t.s]>t.d+1){ f[t.u+t.s][t.s]=t.d+1; q.push(data(t.u+t.s, t.s, t.d+1)); } } if(t.d<f[t.u][0]){ f[t.u][0]=t.d; q.push(data(t.u, 0, t.d)); } } else{ ///move using small steps: for(int i: small[t.u]){ if(f[t.u][p[i]]>f[t.u][0]){ f[t.u][p[i]]=f[t.u][0]; q.push(data(t.u, p[i], f[t.u][p[i]])); } } ///move using big steps: for(int i: big[t.u]){ for(int x=b[i]%p[i]; x<=n; x+=p[i]){ if(f[x][0]>f[t.u][0]+abs(t.u-x)/p[i]){ f[x][0]=f[t.u][0]+abs(t.u-x)/p[i]; q.push(data(x, 0, f[x][0])); } } } } } } int main(){ #ifdef Kanikou if(fopen(taskname".inp", "r")) freopen(taskname".inp", "r", stdin); #endif // Kanikou read(n); read(m); FFOR(i, 0, m){ read(b[i]); read(p[i]); if(p[i]<sq) small[b[i]].pb(i); else big[b[i]].pb(i); } dij(); int ans=f[b[1]][0]; // for(int x=b[1]%p[1]; x<n; x+=p[1]) ans=min(ans, f[x][0]+abs(b[1]-x)/p[1]); if(ans==inf) ans=-1; writeln(ans); }
#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...