結果

問題 No.1638 Robot Maze
ユーザー HaarHaar
提出日時 2021-08-06 21:47:13
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 6 ms / 2,000 ms
コード長 5,954 bytes
コンパイル時間 2,620 ms
コンパイル使用メモリ 225,752 KB
実行使用メモリ 5,008 KB
最終ジャッジ日時 2023-10-17 03:06:28
合計ジャッジ時間 4,075 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,348 KB
testcase_01 AC 2 ms
4,348 KB
testcase_02 AC 2 ms
4,348 KB
testcase_03 AC 5 ms
5,008 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 2 ms
4,348 KB
testcase_06 AC 2 ms
4,348 KB
testcase_07 AC 2 ms
4,348 KB
testcase_08 AC 2 ms
4,348 KB
testcase_09 AC 2 ms
4,348 KB
testcase_10 AC 2 ms
4,348 KB
testcase_11 AC 2 ms
4,348 KB
testcase_12 AC 2 ms
4,348 KB
testcase_13 AC 2 ms
4,348 KB
testcase_14 AC 5 ms
4,728 KB
testcase_15 AC 3 ms
4,348 KB
testcase_16 AC 3 ms
4,348 KB
testcase_17 AC 4 ms
4,348 KB
testcase_18 AC 3 ms
4,348 KB
testcase_19 AC 3 ms
4,348 KB
testcase_20 AC 3 ms
4,348 KB
testcase_21 AC 4 ms
4,532 KB
testcase_22 AC 4 ms
4,532 KB
testcase_23 AC 4 ms
4,532 KB
testcase_24 AC 4 ms
4,532 KB
testcase_25 AC 3 ms
4,532 KB
testcase_26 AC 3 ms
4,532 KB
testcase_27 AC 4 ms
4,532 KB
testcase_28 AC 4 ms
4,532 KB
testcase_29 AC 4 ms
4,532 KB
testcase_30 AC 2 ms
4,348 KB
testcase_31 AC 2 ms
4,348 KB
testcase_32 AC 5 ms
4,836 KB
testcase_33 AC 5 ms
4,904 KB
testcase_34 AC 6 ms
4,972 KB
testcase_35 AC 6 ms
4,908 KB
testcase_36 AC 6 ms
4,972 KB
testcase_37 AC 5 ms
4,840 KB
testcase_38 AC 5 ms
4,836 KB
testcase_39 AC 6 ms
4,960 KB
testcase_40 AC 6 ms
4,860 KB
testcase_41 AC 6 ms
4,912 KB
testcase_42 AC 6 ms
4,916 KB
testcase_43 AC 6 ms
4,908 KB
testcase_44 AC 5 ms
4,924 KB
testcase_45 AC 6 ms
4,912 KB
testcase_46 AC 6 ms
4,948 KB
testcase_47 AC 5 ms
4,892 KB
testcase_48 AC 6 ms
4,968 KB
testcase_49 AC 5 ms
4,844 KB
testcase_50 AC 6 ms
4,912 KB
testcase_51 AC 6 ms
4,972 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

#ifdef DEBUG
#include <Mylib/Debug/debug.cpp>
#else
#define dump(...) ((void)0)
#endif

template <typename T, typename U>
bool chmin(T &a, const U &b) {
  return (a > b ? a = b, true : false);
}

template <typename T, typename U>
bool chmax(T &a, const U &b) {
  return (a < b ? a = b, true : false);
}

template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  std::fill((U *) a, (U *) (a + N), v);
}

template <typename T, size_t N, size_t I = N>
auto make_vector(const std::array<int, N> &a, T value = T()) {
  static_assert(I >= 1);
  static_assert(N >= 1);
  if constexpr (I == 1) {
      return std::vector<T>(a[N - I], value);
    } else {
    return std::vector(a[N - I], make_vector<T, N, I - 1>(a, value));
  }
}

template <typename T>
std::ostream &operator<<(std::ostream &s, const std::vector<T> &a) {
  for (auto it = a.begin(); it != a.end(); ++it) {
    if (it != a.begin()) s << " ";
    s << *it;
  }
  return s;
}

template <typename T>
std::istream &operator>>(std::istream &s, std::vector<T> &a) {
  for (auto &x : a) s >> x;
  return s;
}

std::string YesNo(bool value) { return value ? "Yes" : "No"; }
std::string YESNO(bool value) { return value ? "YES" : "NO"; }
std::string yesno(bool value) { return value ? "yes" : "no"; }

template <typename T>
void putl(const T &value) {
  std::cout << value << "\n";
}

template <typename Head, typename... Tail>
void putl(const Head head, const Tail &... tail) {
  std::cout << head << " ";
  putl(tail...);
}

namespace haar_lib {
  template <typename T>
  struct edge {
    int from, to;
    T cost;
    int index = -1;
    edge() {}
    edge(int from, int to, T cost) : from(from), to(to), cost(cost) {}
    edge(int from, int to, T cost, int index) : from(from), to(to), cost(cost), index(index) {}
  };

  template <typename T>
  struct graph {
    using weight_type = T;
    using edge_type   = edge<T>;

    std::vector<std::vector<edge<T>>> data;

    auto& operator[](size_t i) { return data[i]; }
    const auto& operator[](size_t i) const { return data[i]; }

    auto begin() const { return data.begin(); }
    auto end() const { return data.end(); }

    graph() {}
    graph(int N) : data(N) {}

    bool empty() const { return data.empty(); }
    int size() const { return data.size(); }

    void add_edge(int i, int j, T w, int index = -1) {
      data[i].emplace_back(i, j, w, index);
    }

    void add_undirected(int i, int j, T w, int index = -1) {
      add_edge(i, j, w, index);
      add_edge(j, i, w, index);
    }

    template <size_t I, bool DIRECTED = true, bool WEIGHTED = true>
    void read(int M) {
      for (int i = 0; i < M; ++i) {
        int u, v;
        std::cin >> u >> v;
        u -= I;
        v -= I;
        T w = 1;
        if (WEIGHTED) std::cin >> w;
        if (DIRECTED)
          add_edge(u, v, w, i);
        else
          add_undirected(u, v, w, i);
      }
    }
  };

  template <typename T>
  using tree = graph<T>;
}  // namespace haar_lib

namespace haar_lib {
  template <typename T>
  auto dijkstra(const graph<T> &graph, std::vector<int> src) {
    using P = std::pair<T, int>;

    const int n = graph.size();
    std::vector<std::optional<T>> dist(n);

    std::vector<bool> check(n, false);
    std::priority_queue<P, std::vector<P>, std::greater<P>> pq;

    for (auto s : src) {
      dist[s] = 0;
      pq.emplace(0, s);
    }

    while (not pq.empty()) {
      const auto [d, i] = pq.top();
      pq.pop();

      if (check[i]) continue;
      check[i] = true;

      for (auto &e : graph[i]) {
        if (not dist[e.to]) {
          dist[e.to] = d + e.cost;
          pq.emplace(*dist[e.to], e.to);
        } else {
          if (*dist[e.to] > d + e.cost) {
            dist[e.to] = d + e.cost;
            if (not check[e.to]) pq.emplace(*dist[e.to], e.to);
          }
        }
      }
    }

    return dist;
  }
}  // namespace haar_lib




namespace haar_lib {}

namespace solver {
  using namespace haar_lib;

  constexpr int m1000000007 = 1000000007;
  constexpr int m998244353  = 998244353;

  void init() {
    std::cin.tie(0);
    std::ios::sync_with_stdio(false);
    std::cout << std::fixed << std::setprecision(12);
    std::cerr << std::fixed << std::setprecision(12);
    std::cin.exceptions(std::ios_base::failbit);
  }

  void solve() {
    int H, W; std::cin >> H >> W;
    int64_t U, D, R, L, K, P; std::cin >> U >> D >> R >> L >> K >> P;
    int xs, ys, xt, yt; std::cin >> xs >> ys >> xt >> yt;
    --xs, --ys, --xt, --yt;

    std::vector<std::string> C(H); std::cin >> C;

    graph<int64_t> g(H * W);
    auto index = make_vector<int, 2>({H, W});
    {
      int k = 0;
      for (int i = 0; i < H; ++i) {
        for (int j = 0; j < W; ++j) {
          index[i][j] = k++;
        }
      }
    }

    for (int i = 0; i < H; ++i) {
      for (int j = 0; j < W; ++j) {
        if (i - 1 >= 0 and C[i - 1][j] != '#') g.add_edge(index[i][j], index[i - 1][j], U + (C[i - 1][j] == '@' ? P : 0));
        if (i + 1 < H and C[i + 1][j] != '#') g.add_edge(index[i][j], index[i + 1][j], D + (C[i + 1][j] == '@' ? P : 0));
        if (j - 1 >= 0 and C[i][j - 1] != '#') g.add_edge(index[i][j], index[i][j - 1], L + (C[i][j - 1] == '@' ? P : 0));
        if (j + 1 < W and C[i][j + 1] != '#') g.add_edge(index[i][j], index[i][j + 1], R + (C[i][j + 1] == '@' ? P : 0));
      }
    }

    auto dist = dijkstra(g, {index[xs][ys]});

    // for (int i = 0; i < H; ++i) {
    //   for (int j = 0; j < W; ++j) {
    //     dump(dist[index[i][j]]);
    //   }
    // }


    auto ans = dist[index[xt][yt]];
    dump(ans);

    std::cout << (ans and *ans <= K ? "Yes" : "No") << "\n";
  }
}

int main() {
  solver::init();
  while (true) {
    try {
      solver::solve();
      std::cout << std::flush;
      std::cerr << std::flush;
    } catch (const std::istream::failure &e) {
      break;
    } catch (...) {
      break;
    }
  }
  return 0;
}
0