Submission #676253

#TimeUsernameProblemLanguageResultExecution timeMemory
676253lto5Jakarta Skyscrapers (APIO15_skyscraper)C++14
36 / 100
1087 ms6816 KiB
#include <bits/stdc++.h>
using namespace std;

using TNode = pair<int64_t, int>;
const int N = 50005;

int p[N];
vector<int> g[N];
vector<int> rg[N];
int64_t d[N];
int n, m;

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 id_b;
    cin >> id_b >> p[i];
    g[i].emplace_back(id_b);
    rg[id_b].emplace_back(i);
  }

  memset(d, 0x3f, sizeof(d));
  d[0] = 0;
  priority_queue<TNode, vector<TNode>, greater<TNode>> pq;
  pq.emplace(d[0], 0);

  while (!pq.empty()) {
    int64_t du; int u;
    tie(du, u) = pq.top();
    pq.pop();

    if (d[u] != du) {
      continue;
    }

    if (u == 1) {
      cout << du;
      return 0;
    }

    for (int id_b : g[u]) {
      for (int nxt_b = id_b; nxt_b >= 0; nxt_b -= p[u]) {
        for (int v : rg[nxt_b]) {
          int cost = abs(nxt_b - id_b) / p[u];
          if (d[v] > d[u] + cost) {
            d[v] = d[u] + cost;
            pq.emplace(d[v], v);
          }
        }
      }

      for (int nxt_b = id_b; nxt_b < n; nxt_b += p[u]) {
        for (int v : rg[nxt_b]) {
          int cost = abs(nxt_b - id_b) / p[u];
          if (d[v] > d[u] + cost) {
            d[v] = d[u] + cost;
            pq.emplace(d[v], v);
          }
        }
      }
    }
  }

  cout << -1;
  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...