제출 #516197

#제출 시각아이디문제언어결과실행 시간메모리
516197CaoHuuKhuongDuyJakarta Skyscrapers (APIO15_skyscraper)C++14
0 / 100
1 ms1032 KiB
// #pragma GCC target("avx2") // #pragma GCC optimize("Ofast") // #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> #define ll int #define cll const ll #define lp(a, b, c) for(ll a = b; a <= c; ++a) #define lpd(a, b, c) for(ll a = b; a >= c; --a) #define vec(a) vector<a> #define pp(a, b) pair<a, b> #define EACHCASE lpd(cs, read(), 1) #define Fname "f" using namespace std; template <typename T> inline void Read(T &x){ x = 0; char c; ll dau = 1; while(!isdigit(c = getchar())) if(c == '-') dau = -1; do{ x = x * 10 + c - '0'; } while (isdigit(c = getchar())); x *= dau; } ll read(){ ll tmp; cin >> tmp; return tmp; } void giuncute(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } // void OF(){ // if(fopen(Fname".inp", "r")){ // freopen(Fname".inp", "r", stdin); // freopen(Fname".out", "w", stdout); // } else if(fopen(Fname".in", "r")){ // freopen(Fname".in", "r", stdin); // freopen(Fname".out", "w", stdout); // } // } cll mxn = 3e4 + 5, _sqrt = 173; ll n, m, dp[mxn][_sqrt + 4]; vec(ll) jump[mxn]; priority_queue<pp(ll, pp(ll, ll))> q; void prc(ll u, ll cu, ll step){ if(u + step < n && dp[u + step][step] > cu + 1){ dp[u + step][step] = cu + 1; q.push({-dp[u + step][step], {u + step, step}}); } //cout<<u<<" "<<step<<" "<<dp[u][step]<<" "<<cu<<endl; // cout<<u<<" "<<step<<" "<<dp[u-step][step]<<" "<<cu<<endl; if(u - step >= 0 && dp[u - step][step] > cu + 1){ dp[u - step][step] = cu + 1; q.push({-dp[u - step][step], {u - step, step}}); } // if(u + step < n && dp[u + step][0] > cu + 1){ // dp[u + step][0] = cu + 1; // q.push({-dp[u + step][0], {u + step, 0}}); // } // if(u - step >= 0 && dp[u - step][0] > cu + 1){ // dp[u - step][0] = cu + 1; // q.push({-dp[u - step][0], {u - step, 0}}); // } } bool First[mxn]; int a[mxn]; int main(){ giuncute(); #ifndef ONLINE_JUDGE // OF(); // freopen("test.inp","r",stdin); #endif cin >> n >> m; lp(i, 0, m-1){ static ll u, p; cin >> u >> p; a[i]=u; jump[u].push_back(p); } if (n==1) { cout<<-1; return 0; } lp(i, 0, n-1) lp(j, 0, _sqrt) dp[i][j] = 1e9; lp(i, 0, _sqrt) dp[a[0]][i] = 0; q.push({0, {a[0], 0}}); while(q.size()){ ll cu = -q.top().first, u = q.top().second.first, step = q.top().second.second; q.pop(); if(cu != dp[u][step]) continue; // maintain last step prc(u, cu, step); // change step // if (First[u]) continue; // First[u]=true; for(ll i : jump[u]){ //prc(u,cu-1,i); if (dp[u][0]>cu) { dp[u][0]=cu; q.push({-dp[u][0],{u,0}}); } if(i <= _sqrt) { // cout<<u-i<<" "<<dp[u-i][i]<<endl; if (dp[u][i]>cu) { dp[u][i]=cu; q.push({-dp[u][i],{u,i}}); } prc(u, cu, i); } else{ for(ll v = u + i, cnt = 1; v < n; v += i, ++cnt) if(dp[v][0] > cu + cnt){ dp[v][0] = cu + cnt; q.push({-dp[v][0], {v, 0}}); } for(ll v = u - i, cnt = 1; v >= 0; v -= i, ++cnt) if(dp[v][0] > cu + cnt){ dp[v][0] = cu + cnt; q.push({-dp[v][0], {v, 0}}); } } } } ll ans = 1e9; lp(i, 0, _sqrt) ans = min(ans, dp[a[1]][i]); if(ans ==1e9) ans = -1; cout << 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...