제출 #847118

#제출 시각아이디문제언어결과실행 시간메모리
847118vjudge1Jakarta Skyscrapers (APIO15_skyscraper)C++14
0 / 100
3 ms21912 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 = 175; #define eb emplace_back struct node { int w, u, dir; node() { w = u = dir = 0; } node(int w, int u, int dir) : w(w), u(u), dir(dir) {} 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; void update(int u, int v, int w, int dir,int pre) { if(dist[v][dir] > dist[u][pre] + w) { dist[v][dir] = dist[u][pre] + w; Q.emplace(dist[v][dir], v, dir); } } 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 dir = top.dir; if(top.w != dist[u][dir]) continue; //cout << u << ' ' << dir << '\n'; if(dir) { if(u + dir <= n) update(u, u + dir, 1, dir, dir); if(u - dir >= 0) update(u, u - dir, 1, dir, dir); update(u, u, 0, 0 , dir); } for(int v : adj[u]) { if(v >= SQRT) { for(int j = 1; u + j * v <= n; j++) update(u, u + j * v, j, 0, 0); for(int j = 1; u - j * v >= 0; j++) update(u, u - j * v, j, 0, 0); } else { if(u + v <= n) update(u, u + v, 1, v , 0); if(u - v >= 0) update(u, u - v, 1, v , 0); } } } int res = 1e9; for (int i = 0 ; i < SQRT; ++i) { res = min(res , dist[a[1].first][i]); // cout << dist[1][i] << '\n'; } cout << res; } /* 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...