제출 #87929

#제출 시각아이디문제언어결과실행 시간메모리
87929tieunhiSoccer (JOI17_soccer)C++14
100 / 100
664 ms26400 KiB
#include <bits/stdc++.h>
#define pii pair<ll, ll>
#define mp make_pair
#define F first
#define S second
#define PB push_back
#define FOR(i, u, v) for (int i = u; i <= v; i++)
#define FORD(i, v, u) for (int i = v; i >= u; i--)
#define ll long long
#define N 505
#define MM 100005
#define LN 19
#define maxc 1000000007

using namespace std;

int n, m, A, B, C, k;
pii pp[MM];
ll dist[N][N], d[N][N][5];
int dx[5] = {0, 0, 0, 1, -1};
int dy[5] = {0, 1, -1, 0, 0};

void setup()
{
    cin >> n >> m >> A >> B >> C; n++; m++;
    cin >> k;
    FOR(i, 1, k)
    {
        int u, v; cin >> u >> v; u++; v++;
        pp[i] = mp(u, v);
    }
}
void prepare()
{
    FOR(i, 0, n+1)
        FOR(j, 0, m+1) dist[i][j] = (1ll << 60);
    queue<pii> q;
    FOR(i, 1, k)
    {
        dist[pp[i].F][pp[i].S] = 0;
        q.push(pp[i]);
    }
    while (!q.empty())
    {
        auto z = q.front(); q.pop();
        FOR(i, 1, 4)
        {
            int x = z.F + dx[i];
            int y = z.S + dy[i];
            if (x > 0 && y > 0 && x <= n && y <= m && dist[x][y] == (1ll << 60))
            {
                dist[x][y] = dist[z.F][z.S] + C;
                q.push(mp(x, y));
            }
        }
    }
}
void solve()
{
    priority_queue<pair<ll, pair<pii, int> > >q;
    FOR(i, 1, n)
        FOR(j, 1, m)
            FOR(k, 0, 4) d[i][j][k] = (1ll << 60);
    q.push(mp(0, mp(mp(pp[1].F, pp[1].S), 0)));
    d[pp[1].F][pp[1].S][0] = 0;
    while (!q.empty())
    {
        auto z = q.top(); q.pop();
        int u = z.S.F.F;
        int v = z.S.F.S;
        int dir = z.S.S;
        ll len = -z.F;
        if (d[u][v][dir] < len) continue;
        if (dir == 0)
        {
            FOR(i, 1, 4)
                if (d[u][v][i] > d[u][v][0] + B)
                {
                    d[u][v][i] = d[u][v][0] + B;
                    q.push(mp(-d[u][v][i], mp(mp(u, v), i)));
                }
            FOR(i, 1, 4)
            {
                int x = u + dx[i];
                int y = v + dy[i];
                if (d[x][y][0] > d[u][v][0] + C)
                {
                    d[x][y][0] = d[u][v][0] + C;
                    q.push(mp(-d[x][y][0], mp(mp(x, y), 0)));
                }
            }
        }
        else
        {
            if (d[u][v][0] > d[u][v][dir] + dist[u][v])
            {
                d[u][v][0] = d[u][v][dir] + dist[u][v];
                q.push(mp(-d[u][v][0], mp(mp(u, v), 0)));
            }
            int x = u + dx[dir];
            int y = v + dy[dir];
            if (d[x][y][dir] > d[u][v][dir] + A)
            {
                d[x][y][dir] = d[u][v][dir] + A;
                q.push(mp(-d[x][y][dir], mp(mp(x, y), dir)));
            }
        }
    }
    ll res = 1ll << 60;
    FOR(i, 0, 4) res = min(res, d[pp[k].F][pp[k].S][i]);
    cout <<res;
}
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //freopen("INP.TXT", "r", stdin);
    setup();
    prepare();
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...