Submission #970732

#TimeUsernameProblemLanguageResultExecution timeMemory
970732kilkuwuJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
401 ms262144 KiB
#include <bits/stdc++.h>

#define nl '\n'

const int mxN = 30006;
std::set<std::pair<int, int>> doges[mxN];
int B[mxN], P[mxN];
int N, M;

std::vector<std::pair<int, int>> adj[mxN];

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  std::cin >> N >> M;
  
  for (int i = 0; i < M; i++) {
    std::cin >> B[i] >> P[i];

    auto it = doges[B[i]].lower_bound({P[i], -1});

    if (it == doges[B[i]].end() || it->first != P[i]) {
      doges[B[i]].insert({P[i], i});
    }
  }

  if (B[0] == B[1]) {
    std::cout << 0 << nl;
    return 0;
  }

  for (int i = 0; i < N; i++) {
    for (auto [power, id] : doges[i]) {
      for (int w = 1; i + w * power < N; w++) {
        int to = i + w * power;
        auto it = doges[to].find({power, -1});
        if (it != doges[to].end() && it->first == power) {
          break;
        }
        adj[i].emplace_back(w, to);
      } 
      for (int w = 1; i - w * power >= 0; w++) {
        int to = i - w * power;
        auto it = doges[to].find({power, -1});
        if (it != doges[to].end() && it->first == power) {
          break;
        }
        adj[i].emplace_back(w, to);
      }
    } 
  }

  auto dijkstra = [&](int s) -> int {
    std::priority_queue<std::pair<int, int>> pq;
    std::vector<int> dp(N, 1e9);
    dp[s] = 0;

    pq.push({0, s});
    while (pq.size()) {
      auto [d, u] = pq.top();
      d = -d;
      pq.pop();
      if (dp[u] < d) continue;

      for (auto [w, v] : adj[u]) {
        if (dp[v] > d + w) {
          dp[v] = d + w;
          pq.emplace(-dp[v], v);
        } 
      }
    }

    return dp[B[1]] < 1e9 ? dp[B[1]] : -1;
  };

  std::cout << dijkstra(B[0]) << nl;
}
#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...