제출 #1278851

#제출 시각아이디문제언어결과실행 시간메모리
1278851MisterReaperSoccer (JOI17_soccer)C++20
0 / 100
1260 ms327680 KiB
// File soccer.cpp created on 13.10.2025 at 15:43:22 #include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "/home/ahmetalp/Desktop/Workplace/debug.h" #else #define debug(...) void(23) #endif constexpr i64 inf = i64(1E18); template<typename T> bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } constexpr int dx[] = {0, -1, 0, +1}; constexpr int dy[] = {-1, 0, +1, 0}; template<typename T> using min_pq = std::priority_queue<T, std::vector<T>, std::greater<T>>; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int H, W; std::cin >> H >> W; H++; W++; int A, B, C; std::cin >> A >> B >> C; int N; std::cin >> N; std::vector<std::array<int, 2>> S(N); for (int i = 0; i < N; ++i) { std::cin >> S[i][0] >> S[i][1]; } auto in = [&](int x, int y) -> bool { return 0 <= x && x < H && 0 <= y && y < W; }; std::queue<std::pair<int, int>> que; std::vector<std::vector<int>> dis(H, std::vector<int>(W, -1)); for (int i = 0; i < N; ++i) { dis[S[i][0]][S[i][1]] = 0; que.emplace(S[i][0], S[i][1]); } while (!que.empty()) { auto[x, y] = que.front(); que.pop(); for (int d = 0; d < 4; ++d) { int nx = x + dx[d]; int ny = y + dy[d]; if (in(nx, ny) && dis[nx][ny] == -1) { dis[nx][ny] = dis[x][y] + 1; que.emplace(nx, ny); } } } auto code = [&](int i, int j, int tp) -> int { return tp * H * W + i * W + j; }; auto decode = [&](int x) -> std::array<int, 3> { int tp = x / (H * W); x -= tp * H * W; int i = x / W; int j = x % W; return {i, j, tp}; }; int u; std::vector<i64> mind(5 * H * W, inf); min_pq<std::pair<i64, int>> pq; pq.emplace(mind[code(S[0][0], S[0][1], 0)] = 0, code(S[0][0], S[0][1], 0)); while (!pq.empty()) { auto[dv, v] = pq.top(); pq.pop(); if (mind[v] != dv) { continue; } auto[i, j, tp] = decode(v); if (tp == 0) { for (int d = 0; d < 4; ++d) { u = code(i, j, d + 1); if (chmin(mind[u], dv + B)) { pq.emplace(mind[u], u); } int ni = i + dx[d]; int nj = j + dy[d]; if (in(ni, nj)) { u = code(ni, nj, 0); if (chmin(mind[u], dv + C)) { pq.emplace(mind[u], u); } } } } else { u = code(i, j, 0); if (chmin(mind[u], dv + C * dis[i][j])) { pq.emplace(mind[u], u); } int d = tp - 1; int ni = i + dx[d]; int nj = j + dy[d]; if (in(ni, nj)) { u = code(ni, nj, d + 1); if (chmin(mind[u], dv + A)) { pq.emplace(mind[u], u); } } } } i64 ans = mind[code(S[N - 1][0], S[N - 1][1], 0)]; std::cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...