Submission #483871

#TimeUsernameProblemLanguageResultExecution timeMemory
483871Sohsoh84Jakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
866 ms48056 KiB
//: // ////: /// / : //// / : #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<ll, pll> plll; #define all(x) (x).begin(),(x).end() #define X first #define Y second #define sep ' ' #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl; const ll MAXN = 30000 + 10; const ll SQ = 170; const ll INF = 1e18; vector<int> vec[MAXN]; ll dist[MAXN][SQ], B[MAXN], P[MAXN], n, m; bool F[MAXN][SQ]; priority_queue<plll, vector<plll>, greater<plll>> pq; inline void update(int v, int p, int d) { if (d < dist[v][p]) { dist[v][p] = d; pq.push({d, {v, p}}); } } inline void dijkstra() { while (!pq.empty()) { int v = pq.top().Y.X, p = pq.top().Y.Y, d = pq.top().X; pq.pop(); if (d != dist[v][p]) continue; if (p) { update(v, 0, d); if (v + p < n) update(v + p, p, d + 1); if (v - p >= 0) update(v - p, p, d + 1); } else { for (int i = 1; i < SQ; i++) if (F[v][i]) update(v, i, d); for (int e : vec[v]) { int ind = 0; for (int u = v + e; u < n; u += e) ind++, update(u, 0, d + ind); // ind = 0; for (int u = v - e; u >= 0; u -= e) ind++, update(u, 0, d + ind); // } } } } 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] >= SQ) vec[B[i]].push_back(P[i]); else F[B[i]][P[i]] = true; } for (int i = 0; i < n; i++) memset(dist[i], 63, sizeof dist[i]); pq.push({0, {B[0], 0}}); dist[B[0]][0] = 0; dijkstra(); cout << (dist[B[1]][0] > INF ? -1 : dist[B[1]][0]) << endl; 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...