Submission #1214203

#TimeUsernameProblemLanguageResultExecution timeMemory
1214203kunzaZa183Jakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
861 ms50344 KiB
#include <bits/stdc++.h>
using namespace std;
const int k = 300;

int main() {
  cin.tie(0)->sync_with_stdio(0);
  cin.exceptions(cin.failbit);
  int n, m;
  cin >> n >> m;

  vector<pair<int, int>> vpii(m);

  for (auto &a : vpii) cin >> a.first >> a.second;

  vector<vector<int>> dp(n, vector<int>(k, INT_MAX)), out(n);

  for (int i = 0; i < m; i++) out[vpii[i].first].push_back(i);

  // steps, cur, power
  priority_queue<array<int, 3>> pqpii;

  pqpii.push({0, vpii[0].first, 0});

  while (!pqpii.empty()) {
    auto [steps, cur, power] = pqpii.top();
    pqpii.pop();

    steps = -steps;

    if (dp[cur][power] <= steps) continue;

    dp[cur][power] = steps;

    if (dp[cur][0] > steps || power == 0) {
      dp[cur][0] = steps;

      for (auto a : out[cur])
        if (vpii[a].second >= k) {
          for (int i = cur % vpii[a].second; i < n; i += vpii[a].second) {
            int news = steps + abs(i - cur) / vpii[a].second;
            if (i != cur && dp[i][0] == INT_MAX) {
              pqpii.push({-news, i, 0});
            }
          }
        } else {
          dp[cur][vpii[a].second] = steps;

          int newr = cur + vpii[a].second;
          if (newr < n && dp[newr][vpii[a].second] == INT_MAX) {
            pqpii.push({-steps - 1, newr, vpii[a].second});
          }

          int newl = cur - vpii[a].second;
          if (newl >= 0 && dp[newl][vpii[a].second] == INT_MAX) {
            pqpii.push({-steps - 1, newl, vpii[a].second});
          }
        }
    }

    if (power != 0) {
      int newr = cur + power;
      if (newr < n && dp[newr][power] == INT_MAX) {
        pqpii.push({-steps - 1, newr, power});
      }

      int newl = cur - power;
      if (newl >= 0 && dp[newl][power] == INT_MAX) {
        pqpii.push({-steps - 1, newl, power});
      }
    }
  }

  int x = dp[vpii[1].first][0];
  if (x == INT_MAX) {
    cout << "-1\n";
  } else {
    cout << x << "\n";
  }
}
#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...