Submission #50281

#TimeUsernameProblemLanguageResultExecution timeMemory
50281gs13105Soccer (JOI17_soccer)C++17
100 / 100
1163 ms131756 KiB
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <tuple>
#include <iterator>

using namespace std;

struct edg
{
    int x;
    long long w;
    bool operator <(const edg &e) const
    {
        return w > e.w;
    }
};

int dis[510][510];

long long mem[1260000];
vector<edg> arr[1260000];

int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int h, w;

inline int idx(int t, int x, int y)
{
    return t * (h + 1) * (w + 1) + x * (w + 1) + y;
}

inline void add_edge(int x, int y, long long w)
{
    arr[x].push_back({ y, w });
}

int main()
{
    //freopen("in", "r", stdin);
    //freopen("out", "w", stdout);

    int a, b, c, n, s, g, i, j, d;
    scanf("%d%d%d%d%d%d", &h, &w, &a, &b, &c, &n);

    queue<int> q1;
    memset(dis, -1, sizeof dis);
    for(i = 1; i <= n; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        dis[x][y] = 0;
        q1.push(x * (w + 1) + y);

        if(i == 1)
            s = idx(4, x, y);
        if(i == n)
            g = idx(4, x, y);
    }

    for(i = 1; !q1.empty(); i++)
    {
        int sz = q1.size();
        for(j = 0; j < sz; j++)
        {
            int x = q1.front() / (w + 1);
            int y = q1.front() % (w + 1);
            q1.pop();

            for(d = 0; d < 4; d++)
            {
                int nx = x + dx[d];
                int ny = y + dy[d];
                if(0 <= nx && nx <= h && 0 <= ny && ny <= w && dis[nx][ny] == -1)
                {
                    dis[nx][ny] = i;
                    q1.push(nx * (w + 1) + ny);
                }
            }
        }
    }

    for(i = 0; i <= h; i++)
    {
        for(j = 0; j <= w; j++)
        {
            for(d = 0; d < 4; d++)
            {
                add_edge(idx(4, i, j), idx(d, i, j), b);
                add_edge(idx(d, i, j), idx(4, i, j), 1LL * c * dis[i][j]);

                int nx = i + dx[d];
                int ny = j + dy[d];
                if(0 <= nx && nx <= h && 0 <= ny && ny <= w)
                {
                    add_edge(idx(4, i, j), idx(4, nx, ny), c);
                    add_edge(idx(d, i, j), idx(d, nx, ny), a);
                }
            }
        }
    }

    priority_queue<edg> pq;
    memset(mem, -1, sizeof mem);
    mem[s] = 0;
    pq.push({ s, 0 });
    while(!pq.empty())
    {
        int x = pq.top().x;
        long long w = pq.top().w;
        pq.pop();

        if(mem[x] < w)
            continue;

        for(edg &e : arr[x])
        {
            long long nw = w + e.w;
            if(mem[e.x] == -1 || nw < mem[e.x])
            {
                mem[e.x] = nw;
                pq.push({ e.x, nw });
            }
        }
    }
    printf("%lld\n", mem[g]);
    return 0;
}

Compilation message (stderr)

soccer.cpp: In function 'int main()':
soccer.cpp:55:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d%d%d", &h, &w, &a, &b, &c, &n);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
soccer.cpp:62:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &x, &y);
         ~~~~~^~~~~~~~~~~~~~~~
soccer.cpp:137:11: warning: 'g' may be used uninitialized in this function [-Wmaybe-uninitialized]
     printf("%lld\n", mem[g]);
     ~~~~~~^~~~~~~~~~~~~~~~~~
soccer.cpp:117:12: warning: 's' may be used uninitialized in this function [-Wmaybe-uninitialized]
     pq.push({ s, 0 });
     ~~~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...