Submission #1246046

#TimeUsernameProblemLanguageResultExecution timeMemory
1246046nqknhtJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
74 ms127304 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define len(s) (ll)s.size() const ll I = 2e5 + 9; const ll Z = 998244353; using namespace std; int n, m; namespace subfull { vector<pair<pair<int, int>, int>> adj[5009][230]; priority_queue<pair<ll, pair<int, int>>> pq; bool check[2007][2008]; ll dis[50008][230]; void addEd(ll u, ll xu, ll v, ll xv, ll w) { adj[u][xu].push_back({{v, xv}, w}); } void solve() { ll sav, root; for (ll i = 1; i <= m; i++) { ll pos, power; cin >> pos >> power; if (i == 2) sav = pos; if (i == 1) root = pos; if (power >= sqrt(n)) { for (ll j = pos - power, w = 1; j >= 0; j -= power, w++) adj[pos][0].push_back({{j, 0}, w}); for (ll j = pos + power, w = 1; j < n; j += power, w++) adj[pos][0].push_back({{j, 0}, w}); continue; } addEd(pos, power, pos, 0, 0); addEd(pos, 0, pos, power, 0); if (pos - power >= 0) { addEd(pos, power, pos - power, 0, 1); addEd(pos, power, pos - power, power, 1); } if (pos + power < n) { addEd(pos, power, pos + power, power, 1); addEd(pos, power, pos + power, 0, 1); } } memset(dis, 10, sizeof dis); dis[root][0] = 0; pq.push({0, {root, 0}}); ll rs = dis[1][1]; while (!pq.empty()) { ll af = pq.top().se.fi, as = pq.top().se.se; pq.pop(); if (check[af][as]) continue; check[af][as] = true; if (af == sav) rs = min(rs, dis[af][as]); if (as != 0) { if (af + as < n && dis[af + as][as] > dis[af][as] + 1) { dis[af + as][as] = dis[af][as] + 1; pq.push({-dis[af + as][as], {af + as, as}}); } if (af - as >= 0 && dis[af - as][as] > dis[af][as] + 1) { dis[af - as][as] = dis[af][as] + 1; pq.push({-dis[af - as][as], {af - as, as}}); } if (dis[af][0] > dis[af][as]) { dis[af][0] = dis[af][as]; pq.push({-dis[af][0], {af, 0}}); } } for (auto z : adj[af][as]) { if (dis[z.fi.fi][z.fi.se] > dis[af][as] + z.se) { dis[z.fi.fi][z.fi.se] = dis[af][as] + z.se; pq.push({-dis[z.fi.fi][z.fi.se], {z.fi.fi, z.fi.se}}); } } } cout << (rs < 1000000000 ? rs : -1); } } int main() { #define TN "sky" if (fopen(TN ".inp", "r")) { freopen(TN ".inp", "r", stdin); freopen(TN ".out", "w", stdout); } cin.tie(0)->sync_with_stdio(0); cin >> n >> m; subfull::solve(); return 0; }

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:107:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         freopen(TN ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
skyscraper.cpp:108:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |         freopen(TN ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...