Submission #244272

#TimeUsernameProblemLanguageResultExecution timeMemory
244272Matteo_VerzAwesome Arrowland Adventure (eJOI19_adventure)C++11
100 / 100
97 ms21112 KiB
/*
                `-/oo+/-   ``
              .oyhhhhhhyo.`od
             +hhhhyyoooos. h/
            +hhyso++oosy- /s
           .yoooossyyo:``-y`
            ..----.` ``.-/+:.`
                   `````..-::/.
                  `..```.-::///`
                 `-.....--::::/:
                `.......--::////:
               `...`....---:::://:
             `......``..--:::::///:`
            `---.......--:::::////+/`
            ----------::::::/::///++:
            ----:---:::::///////////:`
            .----::::::////////////:-`
            `----::::::::::/::::::::-
             `.-----:::::::::::::::-
               ...----:::::::::/:-`
                 `.---::/+osss+:`
                   ``.:://///-.
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <cmath>

using namespace std;

const int INF = 2e9;
const int N = 500;

int n, m;

vector <pair <int, int>> g[5 + N * N];
bool viz[5 + N * N];
int dp[5 + N * N];

class Min_Heap {
    private:
        pair <int, int> h[5 + N * N];
        int sz;

        void Sift_Up(int pos) {
            int parent;
            parent = pos >> 1;

            while(h[pos].second < h[parent].second && parent > 0) {
                swap(h[pos], h[parent]);

                pos = parent;
                parent = pos >> 1;
            }
        }

        void Sift_Down(int pos) {
            int child;
            child = pos << 1;

            if(child + 1 <= sz && h[child].second > h[child + 1].second)
                child++;
            while(child <= sz && h[child].second < h[pos].second) {
                swap(h[pos], h[child]);

                pos = child;
                child = pos << 1;

                if(child + 1 <= sz && h[child].second > h[child + 1].second) child++;
            }
        }

    public:
        void Clear() {
            sz = 0;
        }

        void Push(pair <int, int> val) {
            h[++sz] = val;
            Sift_Up(sz);
        }

        void Pop() {
            swap(h[1], h[sz]);
            sz--;
            Sift_Down(1);
        }

        pair <int, int> Top() {
            return h[1];
        }

        int Size() {
            return sz;
        }
};
Min_Heap heap;

void Dijkstra(int nodStart) {
    for(int i = 1; i <= n * m; i++) dp[i] = INF;

    dp[nodStart] = 0;
    heap.Push(make_pair(nodStart, 0));

    while(heap.Size()) {
        pair <int, int> top = heap.Top();
        heap.Pop();

        if(viz[top.first] == false) {
            viz[top.first] = true;

            for(auto to : g[top.first]) {
                if(dp[to.first] > to.second + dp[top.first]) {
                    dp[to.first] = to.second + dp[top.first];
                    heap.Push(make_pair(to.first, dp[to.first]));
                }
            }
        }
    }
}

int main() {
#ifdef BLAT
    freopen("input.in", "r", stdin);
    freopen("output.out", "w", stdout);
#endif // BLAT

    cin >> n >> m;

    for(int i = 1; i <= n; i++) {
        string s;
        cin >> s;

        for(int j = 0; j < s.size(); j++) {
            int idx = (i - 1) * m + j + 1;
            int idxn, idxe, idxs, idxw;
            idxn = idx - m;
            idxs = idx + m;
            idxe = idx + 1;
            idxw = idx - 1;

            if(s[j] == 'N') {
                if(i > 1) g[idx].push_back(make_pair(idxn, 0));
                if(j < m - 1) g[idx].push_back(make_pair(idxe, 1));
                if(i < n) g[idx].push_back(make_pair(idxs, 2));
                if(j > 0) g[idx].push_back(make_pair(idxw, 3));
            } else if(s[j] == 'E') {
                if(i > 1) g[idx].push_back(make_pair(idxn, 3));
                if(j < m - 1) g[idx].push_back(make_pair(idxe, 0));
                if(i < n) g[idx].push_back(make_pair(idxs, 1));
                if(j > 0) g[idx].push_back(make_pair(idxw, 2));
            } else if(s[j] == 'S') {
                if(i > 1) g[idx].push_back(make_pair(idxn, 2));
                if(j < m - 1) g[idx].push_back(make_pair(idxe, 3));
                if(i < n) g[idx].push_back(make_pair(idxs, 0));
                if(j > 0) g[idx].push_back(make_pair(idxw, 1));
            } else if(s[j] == 'W') {
                if(i > 1) g[idx].push_back(make_pair(idxn, 1));
                if(j < m - 1) g[idx].push_back(make_pair(idxe, 2));
                if(i < n) g[idx].push_back(make_pair(idxs, 3));
                if(j > 0) g[idx].push_back(make_pair(idxw, 0));
            }
        }
    }

    Dijkstra(1);

    if(dp[n * m] == INF) cout << -1 << '\n';
    else cout << dp[n * m] << '\n';
    return 0;
}

Compilation message (stderr)

adventure.cpp: In function 'int main()':
adventure.cpp:141:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < s.size(); j++) {
                        ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...