// 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 time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |