結果
問題 | No.1638 Robot Maze |
ユーザー |
![]() |
提出日時 | 2022-08-31 16:34:36 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 18 ms / 2,000 ms |
コード長 | 9,653 bytes |
コンパイル時間 | 10,945 ms |
コンパイル使用メモリ | 292,484 KB |
最終ジャッジ日時 | 2025-02-07 00:14:08 |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 49 |
ソースコード
#line 2 "lib/prelude.hpp"#ifndef LOCAL#pragma GCC optimize("O3,unroll-loops")#pragma GCC target("avx2")#endif#include <bits/stdc++.h>using namespace std;using ll = long long;#define rep2(i, m, n) for (auto i = (m); i < (n); i++)#define rep(i, n) rep2(i, 0, n)#define repr2(i, m, n) for (auto i = (n); i-- > (m);)#define repr(i, n) repr2(i, 0, n)#define all(x) begin(x), end(x)template <class T>auto ndvec(size_t n, T&& x) { return vector(n, forward<T>(x)); }template <class... Ts>auto ndvec(size_t n, Ts&&... xs) { return vector(n, forward<Ts>(xs)...); }#line 3 "lib/graph.hpp"struct unit_edge {int to;operator int() const { return to; }int w() const { return 1; }};template <class Weight>struct weighted_edge {int to;Weight weight;operator int() const { return to; }Weight w() const { return weight; }};template <class Inner>struct basic_graph {using weight_type = void;const Inner& inner;basic_graph(const Inner& g) : inner(g) {}template <class F>void adj(int v, F f) const {for (auto u : inner[v]) f(unit_edge{u});}};template <class Inner, class Weight>struct basic_weighted_graph {using weight_type = Weight;const Inner& inner;basic_weighted_graph(const Inner& g) : inner(g) {}template <class F>void adj(int v, F f) const {for (auto [u, w] : inner[v]) f(weighted_edge<weight_type>{u, w});}};template <class Inner>struct graph_trait {using weight_type = typename Inner::weight_type;const Inner& g;graph_trait(const Inner& g) : g(g) {}int size() const { return g.size(); }template <class F>void adj(int v, F f) const { g.adj(v, f); }};template <class T>constexpr bool is_weighted_v =!is_same_v<typename graph_trait<T>::weight_type, void>;template <class T>using weight_t =conditional_t<is_weighted_v<T>, typename graph_trait<T>::weight_type, int>;template <class T>using edge_t =conditional_t<is_weighted_v<T>, weighted_edge<weight_t<T>>, unit_edge>;template <size_t N>struct graph_trait<vector<int>[N]> : basic_graph<vector<int>[N]> {using basic_graph<vector<int>[N]>::basic_graph;int size() const { return N; }};template <>struct graph_trait<vector<vector<int>>> : basic_graph<vector<vector<int>>> {using basic_graph<vector<vector<int>>>::basic_graph;int size() const { return this->inner.size(); }};template <size_t N, class Weight>struct graph_trait<vector<pair<int, Weight>>[N]>: basic_weighted_graph<vector<pair<int, Weight>>[N], Weight> {using basic_weighted_graph<vector<pair<int, Weight>>[N],Weight>::basic_weighted_graph;int size() const { return N; }};template <class Weight>struct graph_trait<vector<vector<pair<int, Weight>>>>: basic_weighted_graph<vector<vector<pair<int, Weight>>>, Weight> {using basic_weighted_graph<vector<vector<pair<int, Weight>>>,Weight>::basic_weighted_graph;int size() const { return this->inner.size(); }};#line 3 "lib/func/constant.hpp"template <class T, T val>struct constant {template <class... Ts>constexpr T operator()(Ts&&...) const { return val; }};#line 4 "lib/graph/grid.hpp"enum direction { Left, Right, Up, Down };template <class Weight = constant<int, 1>, char Wall = '#'>class grid_graph {public:template <class It>grid_graph(It grid, It grid_last, Weight c = Weight()): h(grid_last - grid + 2), w(grid[0].size() + 2), c(c),data(h * w, Wall) {rep(i, h - 2) copy(all(grid[i]), data.begin() + (i + 1) * w + 1);}int map(int r, int c) const { return (r + 1) * w + c + 1; }char operator[](int i) const { return data[i]; }char operator[](int i[2]) const { return data[map(i[0], i[1])]; }using weight_type = invoke_result_t<Weight, char, int>;int size() const { return h * w; }template <class F>void adj(int v, F f) const {if (data[v] == Wall) return;int d[] = {-1, 1, -w, w};rep(i, 4) if (data[v + d[i]] != Wall)f(edge_t<grid_graph>{v + d[i], c(data[v + d[i]], i)});}private:int h, w;Weight c;vector<char> data;};#line 3 "lib/graph/dijkstra.hpp"template <class G, class Iter>vector<weight_t<G>> dijkstra(const G& graph, Iter s_it, Iter s_last) {graph_trait<G> g(graph);vector<weight_t<G>> dist(g.size(), numeric_limits<weight_t<G>>::max());priority_queue<pair<weight_t<G>, int>, vector<pair<weight_t<G>, int>>, greater<>> hp;while (s_it != s_last) hp.emplace(weight_t<G>(0), *s_it), dist[*s_it++] = weight_t<G>(0);while (!hp.empty()) {auto [w, v] = hp.top();hp.pop();if (w != dist[v]) continue;g.adj(v, [&](auto&& e) {if (dist[e.to] > dist[v] + e.w())dist[e.to] = dist[v] + e.w(), hp.emplace(dist[e.to], e.to);});}return dist;}template <class G>vector<weight_t<G>> dijkstra(const G& graph, int s) {return dijkstra(graph, &s, &s + 1);}#line 3 "lib/io.hpp"template <size_t BUF_SIZE = 1 << 26>class stdin_reader {public:stdin_reader() { buf[fread_unlocked(buf, 1, sizeof(buf), stdin)] = 0; }template <class T>enable_if_t<is_integral_v<T>> read(T& x) {skip(); [[maybe_unused]] bool neg = false;if constexpr (is_signed_v<T>) neg = *p == '-' ? (p++, true) : false;x = 0; while (*p > ' ') x = x * 10 + (*p++ & 0x0F);if constexpr (is_signed_v<T>) x = neg ? -x : x;}template <class T> void_t<decltype(&T::val)> read(T& x) { x = T((unsigned)(*this)); }void read(char* q) {skip(); char* p0 = p; while (*p > ' ') p++;copy(p0, p, q);}template <size_t N> void read(char (&s)[N]) { read(s); }void read(string& s) {skip(); char* p0 = p; while (*p > ' ') p++;s.assign(p0, p);}template <class T, class U> void read(pair<T, U>& x) { read(x.first), read(x.second); }template <class... Ts>void read(tuple<Ts...>& x) { read_tuple(x, make_index_sequence<sizeof...(Ts)>{}); }template <class T, size_t N> void read(T (&a)[N]) { for (auto& e : a) read(e); }template <class T> operator T() { T x; return read(x), x; }template <class... Ts> void operator()(Ts&... xs) { (read(xs), ...); }int operator--() { return (int)*this - 1; }template <class T> void vec(vector<T>& v, int n) { v.resize(n); for (auto& e : v) read(e); }template <class T> vector<T> vec(int n) { vector<T> v(n); return vec(v, n), v; }private:char buf[BUF_SIZE], *p = buf;void skip() { while (*p <= ' ') p++; }template <class T, size_t... Is>void read_tuple(T& x, index_sequence<Is...>) { (*this)(get<Is>(x)...); }};template <size_t BUF_SIZE = 1 << 26>class stdout_writer {public:~stdout_writer() { flush(); }void flush() { fwrite_unlocked(buf, 1, p - buf, stdout), p = buf; }void write_char(char c) { *p++ = c; }void write(char c) { write_char(c); }template <class T> enable_if_t<is_integral_v<T>> write(T x) {if (!x) return write_char('0');if constexpr (is_signed_v<T>) if (x < 0) write_char('-'), x = -x;static char tmp[16];char* q = end(tmp);while (x >= 10000) memcpy(q -= 4, four_digits.data + x % 10000 * 4, 4), x /= 10000;if (x < 10) write_char('0' + x);else if (x < 100)write_char('0' + (uint8_t)x / 10), write_char('0' + (uint8_t)x % 10);else if (x < 1000) memcpy(p, four_digits.data + x * 4 + 1, 3), p += 3;else memcpy(p, four_digits.data + x * 4, 4), p += 4;memcpy(p, q, end(tmp) - q), p += end(tmp) - q;}template <class T> void_t<decltype(&T::val)> write(T x) { write(x.val()); }void write(const char* s) { p = stpcpy(p, s); }void write(const string& s) { memcpy(p, s.c_str(), s.size()), p += s.size(); }template <class T, class U>void write(const pair<T, U>& x) { write(x.first), write_char(' '), write(x.second); }template <class... Ts>void write(const tuple<Ts...>& x) { write_tuple(x, make_index_sequence<sizeof...(Ts)>{}); }template <class... Ts>void write(const Ts&... xs) { ((write(xs), write_char(' ')), ...), --p; }template <class... Ts>void writeln(const Ts&... xs) { write(xs...), write_char('\n'); }template <class... Ts> void operator()(const Ts&... xs) { writeln(xs...); }template <class It> void iter(It first, It last) {while (first != last) write(*first++), write_char(' ');p[-1] = '\n';}#define INSTANT(s) \void s() { writeln("s"); }INSTANT(No) INSTANT(NO) INSTANT(Aoki)INSTANT(possible) INSTANT(Possible) INSTANT(POSSIBLE)INSTANT(impossible) INSTANT(Impossible) INSTANT(IMPOSSIBLE)#undef INSTANTvoid Yes(bool b = true) { writeln(b ? "Yes" : "No"); }void YES(bool b = true) { writeln(b ? "YES" : "NO"); }void Takahashi(bool b = true) { writeln(b ? "Takahashi" : "Aoki"); }private:char buf[BUF_SIZE], *p = buf;template <class T, size_t... Is> void write_tuple(const T& x, index_sequence<Is...>) {((write(get<Is>(x)), write_char(' ')), ...), --p;}struct four_digits {char data[40000];constexpr four_digits() : data() {for (int i = 0; i < 10000; i++)for (int n = i, j = 4; j--;) data[i * 4 + j] = n % 10 + '0', n /= 10;}} static constexpr four_digits{};};static stdin_reader<> in;static stdout_writer<> out;#line 4 "main.cpp"int main() {int h = in, w = in, u = in, d = in, r = in, l = in;ll k = in, p = in;int xs = --in, ys = --in, xt = --in, yt = --in;auto grid = in.vec<string>(h);auto weight = [=](char c, int dir) {return (c == '@' ? p : 0) + ((int[]){l, r, u, d})[dir];};grid_graph graph(all(grid), weight);ll ans = dijkstra(graph, graph.map(xs, ys))[graph.map(xt, yt)];out.Yes(ans <= k);(void)w;}