Submission #847142

#TimeUsernameProblemLanguageResultExecution timeMemory
847142vjudge1Jakarta Skyscrapers (APIO15_skyscraper)C++17
22 / 100
6 ms25176 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int N = 3e4 + 5; const int oo = 1e9; const int SQRT = 200; #define eb emplace_back struct node { int w, u, s; node() { w = u = s = 0; } node(int w, int u, int s) : w(w), u(u), s(s) {} friend bool operator > (node a, node b) { return a.w > b.w; } }; int n, m; int dist[N][SQRT]; pii a[N]; vector<int> adj[N]; priority_queue<node, vector<node>, greater<node>> Q; bool vis[N]; int ans = oo; void update(int u, int v, int w, int cur) { if(dist[v][cur] > dist[u][cur] + w) { dist[v][cur] = dist[u][cur] + w; Q.emplace(dist[v][cur], v, cur); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].eb(v); a[i] = {u, v}; } memset(dist, 0x3f, sizeof dist); dist[a[0].first][0] = 0; Q.emplace(0, a[0].first, 0); while(!Q.empty()) { node top = Q.top(); Q.pop(); int u = top.u; int cur = top.s; if(dist[u][cur] != top.w) continue; if(u == a[1].first) ans = min(ans, dist[a[1].first][cur]); if(cur) { if(u + cur <= n) update(u, u + cur, 1, cur); if(u - cur >= 0) update(u, u - cur, 1, cur); } for(int v : adj[u]) { if(dist[u][v] > dist[u][cur]) dist[u][v] = dist[u][cur]; if(v >= SQRT) { for(int j = 1; u + j * v <= n; j++) update(u, u + j * v, j, 0); for(int j = 1; u - j * v >= 0; j++) update(u, u - j * v, j, 0); } else { if(u + v <= n) update(u, u + v, 1, v); if(u - v >= 0) update(u, u - v, 1, v); } } } cout << (ans == oo ? -1 : ans); } /* 5 3 0 2 1 1 4 1 */
#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...