제출 #1188619

#제출 시각아이디문제언어결과실행 시간메모리
1188619jerzykSoccer (JOI17_soccer)C++20
100 / 100
352 ms19732 KiB
#include <bits/stdc++.h>

using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1'000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1'000'000'007LL;
const int N = 507;
vector<pair<int, int>> roza;
int d1[N][N];
ll dis[N][N][2 + 4];

void DoRoza()
{
    roza.pb(pair{-1, 0});
    roza.pb(pair{0, -1});
    roza.pb(pair{1, 0});
    roza.pb(pair{0, 1});
}

void BFS(int n, int m)
{
    int i, j;
    queue<pair<int, int>> q;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= m; ++j)
            if(d1[i][j] == 0) q.push(pair{i, j});
    while((int)q.size() > 0)
    {
        i = q.front().st; j = q.front().nd;
        q.pop();
        for(int l = 0; l < (int)roza.size(); ++l)
        {
            int ni = i + roza[l].st, nj = j + (int)roza[l].nd;
            if(ni < 0 || ni > n || nj < 0 || nj > m) continue;
            if(d1[ni][nj] > d1[i][j] + 1)
            {
                d1[ni][nj] = d1[i][j] + 1;
                q.push(pair{ni, nj});
            }
        }
    }
}

void Dijkstra(int n, int m, ll A, ll B, ll C)
{
    priority_queue<pair<ll, pair<pair<int, int>, int>>> q;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= m; ++j)
            if(dis[i][j][0] == 0)
                q.push(pair{0, pair{pair{i, j}, 0}});
    while((int)q.size() > 0)
    {
        int i = q.top().nd.st.st, j = q.top().nd.st.nd, r = q.top().nd.nd;
        ll d = -q.top().st, nd;
        q.pop();
        if(dis[i][j][r] != d)
            continue;
        //cout << "D: " << i << " " << j << " " << r << " : " << dis[i][j][r] << "\n";
        if(r == 0)
        {
            nd = d + C * (ll)d1[i][j];
            if(dis[i][j][1] > nd)
            {
                dis[i][j][1] = nd;
                q.push(pair{-nd, pair{pair{i, j}, 1}});
            }
            continue;
        }
        if(r == 1)
        {
            if(dis[i][j][0] > d)
            {
                dis[i][j][0] = d;
                q.push(pair{-d, pair{pair{i, j}, 0}});
            }
            nd = d + C;
            for(int l = 0; l < (int)roza.size(); ++l)
            {
                int ni = i + roza[l].st, nj = j + (int)roza[l].nd;
                if(ni < 0 || ni > n || nj < 0 || nj > m) continue;
                if(dis[ni][nj][1] > nd)
                {
                    dis[ni][nj][1] = nd;
                    q.push(pair{-nd, pair{pair{ni, nj}, 1}});
                }
            }
            nd = d + A + B;
            for(int l = 0; l < (int)roza.size(); ++l)
            {
                int ni = i + roza[l].st, nj = j + (int)roza[l].nd;
                if(ni < 0 || ni > n || nj < 0 || nj > m) continue;
                if(dis[ni][nj][2 + l] > nd)
                {
                    dis[ni][nj][2 + l] = nd;
                    q.push(pair{-nd, pair{pair{ni, nj}, 2 + l}});
                }
            }
            continue;
        }
        if(dis[i][j][0] > d)
        {
            dis[i][j][0] = d;
            q.push(pair{-d, pair{pair{i, j}, 0}});
        }
        int ni = i + roza[r - 2].st, nj = j + (int)roza[r - 2].nd;
        if(ni < 0 || ni > n || nj < 0 || nj > m) continue;
        nd = d + A;
        if(dis[ni][nj][r] > nd)
        {
            dis[ni][nj][r] = nd;
            q.push(pair{-nd, pair{pair{ni, nj}, r}});
        }
    }
}

void Solve()
{
    int n, m, il, a, b;
    ll A, B, C;
    cin >> n >> m;
    cin >> A >> B >> C;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= m; ++j)
            d1[i][j] = II;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= m; ++j)
            for(int r = 0; r < 6; ++r)
                dis[i][j][r] = I;
    cin >> il;
    for(int i = 1; i <= il; ++i)
    {
        cin >> a >> b;
        d1[a][b] = 0;
        if(i == 1)
            dis[a][b][0] = 0LL;
    }
    BFS(n, m);
    Dijkstra(n, m, A, B, C);
    ll ans = dis[a][b][0];
    cout << ans << "\n";
}

int main()
{
    DoRoza();
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //int t; cin >> t;
    //while(t--)
        Solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...