Submission #843744

#TimeUsernameProblemLanguageResultExecution timeMemory
843744TobJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
709 ms250488 KiB
#include <bits/stdc++.h> #define ll long long #define F first #define S second #define all(x) x.begin(), x.end() #define pb push_back #define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0) using namespace std; typedef pair <int, int> pii; const int N = 30007, B = 300, inf = 1e9; int n, m; int b[N], p[N], dis[N*B]; vector <int> td[N]; vector <pii> adj[N*B]; set <pii> s; int En(int x, int y = 0) {return y*N + x;} pii De(int x) {return {x%N, x/N};} void Vis(int x, int y, int w) { if (dis[x] + w < dis[y]) { if (dis[y] != inf) s.erase({dis[y], y}); dis[y] = dis[x] + w; s.insert({dis[y], y}); } } int main () { FIO; cin >> n >> m; for (int i = 1; i < B; i++) { for (int j = 0; j < n; j++) { } } for (int i = 0; i < m; i++) { cin >> b[i] >> p[i]; if (p[i] < B) adj[b[i]].pb({En(b[i], p[i]), 0}); else td[b[i]].pb(p[i]); } for (int i = 0; i < N*B; i++) dis[i] = inf; s.insert({0, b[0]}); dis[b[0]] = 0; while (!s.empty()) { auto p = s.begin(); int x = (*p).S; s.erase(p); pii de = De(x); int A = de.F, C = de.S; if (C > 0) { if (A-C >= 0) Vis(x, En(A-C, C), 1); if (A+C < n) Vis(x, En(A+C, C), 1); Vis(x, A, 0); } else { for (auto P : td[x]) { for (int j = A-P, k = 1; j >= 0; j -= P, k++) Vis(x, j, k); for (int j = A+P, k = 1; j < n; j += P, k++) Vis(x, j, k); } } for (auto it : adj[x]) Vis(x, it.F, it.S); } if (dis[b[1]] != inf) cout << dis[b[1]] << "\n"; else cout << "-1\n"; 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...