Submission #110222

#TimeUsernameProblemLanguageResultExecution timeMemory
110222hugo_pmJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
1092 ms251136 KiB
#include <bits/stdc++.h> using namespace std; #define form2(i, a, b) for (int i = (a); i < (b); ++i) #define ford2(i, a, b) for (int i = (a-1); i >= (b); --i) #define form(i, n) form2(i, 0, n) #define ford(i, n) ford2(i, n, 0) #define chmax(x, v) x = max(x, (v)) #define chmin(x, v) x = min(x, (v)) #define fi first #define se second const int BIG = (int)(1e9); typedef long long ll; typedef long double ld; typedef pair<int, int> pii; void solve(); signed main() { ios::sync_with_stdio(false); cin.tie(0); solve(); return 0; } const int borneSuj = 30*1000 + 5; const int borneTab = 181*borneSuj; int gt[borneSuj][181]; int arr = -1, dep=-1; int nbPlaces, nbDoges, nbNoeuds; int limSqd; vector<pii> adj[borneTab]; void solve() { cin >> nbPlaces >> nbDoges; chmax(nbPlaces, 20); nbNoeuds = nbPlaces; limSqd = sqrt(nbPlaces); form2(distance, 1, limSqd) { form(ini, distance) { for (int place = ini; place < nbPlaces; place += distance) { int corNod = nbNoeuds; ++nbNoeuds; adj[corNod].push_back({place, 0}); gt[place][distance] = corNod; if (place != ini) { adj[corNod].push_back({corNod-1, 1}); adj[corNod-1].push_back({corNod, 1}); } } } } form(iDoge, nbDoges) { int pos, saut; cin >> pos >> saut; if (iDoge == 0) dep = pos; if (iDoge == 1) arr = pos; if (saut < limSqd) { adj[pos].push_back({gt[pos][saut], 0}); } else { for (int dd = 1; pos + dd*saut < nbPlaces; ++dd) { adj[pos].push_back({pos+dd*saut, dd}); } for (int dd = 1; pos - dd*saut >= 0; ++dd) { adj[pos].push_back({pos - dd*saut, dd}); } } } vector<int> md(nbNoeuds, BIG); md[dep] = 0; priority_queue<pii, vector<pii>, greater<pii>> pq; pq.push({0,dep}); while (! pq.empty()) { int dis = pq.top().fi, nod = pq.top().se; pq.pop(); if (dis != md[nod]) continue; for (auto voRaw : adj[nod]) { int vo = voRaw.fi, poids = voRaw.se; if (dis + poids < md[vo]) { md[vo] = dis+poids; pq.push({md[vo], vo}); } } } if (md[arr] == BIG) cout << "-1\n"; else cout << md[arr] << "\n"; }
#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...