제출 #539067

#제출 시각아이디문제언어결과실행 시간메모리
539067timreizinJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
657 ms262144 KiB
#include <iostream> #include <vector> #include <algorithm> #include <deque> #include <cassert> using namespace std; const short INF = 32767; int main() { int n, m; cin >> n >> m; vector<pair<int, int>> doges(m); for (auto &[b, p] : doges) cin >> b >> p; const short D = 180; vector<vector<short>> dp(n, vector<short>(D, INF)); vector<vector<short>> canGet(n), starts(n); for (auto &[b, p] : doges) { starts[b].push_back(p); if (p >= D) for (int i = b % p; i < n; i += p) canGet[i].push_back(p); } for (int i = 0; i < n; ++i) { sort(canGet[i].begin(), canGet[i].end()); canGet[i].erase(unique(canGet[i].begin(), canGet[i].end()), canGet[i].end()); sort(starts[i].begin(), starts[i].end()); starts[i].erase(unique(starts[i].begin(), starts[i].end()), starts[i].end()); for (int j = 0; j < canGet.size(); ++j) dp[i].push_back(INF); } auto getInd = [&canGet, &D](short v, short p) -> short { if (p < D) return p; //assert(lower_bound(canGet[v].begin(), canGet[v].end(), p) != canGet[v].end()); /*if (lower_bound(canGet[v].begin(), canGet[v].end(), p) == canGet[v].end()) { cout << v << ' ' << p << '\n'; exit(0); }*/ return (short)distance(canGet[v].begin(), lower_bound(canGet[v].begin(), canGet[v].end(), p)) + (short)D; }; short ind = getInd(doges[0].first, doges[0].second); dp[doges[0].first][ind] = 0; deque<pair<short, short>> dq; dq.emplace_back(doges[0].first, doges[0].second); while (!dq.empty()) { auto [i, p] = dq.front(); dq.pop_front(); short ind = getInd(i, p); for (int j : starts[i]) { int ind2 = getInd(i, j); if (dp[i][ind2] > dp[i][ind]) { dp[i][ind2] = dp[i][ind]; dq.emplace_front(i, j); } } starts[i].clear(); if (i - p >= 0) { short ind2 = getInd(i - p, p); if (dp[i - p][ind2] > dp[i][ind] + 1) { dp[i - p][ind2] = dp[i][ind] + 1; dq.emplace_back(i - p, p); } } if (i + p < n) { short ind2 = getInd(i + p, p); if (dp[i + p][ind2] > dp[i][ind] + 1) { dp[i + p][ind2] = dp[i][ind] + 1; dq.emplace_back(i + p, p); } } } ind = getInd(doges[1].first, doges[1].second); if (dp[doges[1].first][ind] == INF) cout << -1; else cout << dp[doges[1].first][ind]; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:32:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<short int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |         for (int j = 0; j < canGet.size(); ++j) dp[i].push_back(INF);
      |                         ~~^~~~~~~~~~~~~~~
#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...