結果

問題 No.1283 Extra Fee
ユーザー HaarHaar
提出日時 2020-11-06 22:06:24
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 365 ms / 2,000 ms
コード長 5,525 bytes
コンパイル時間 2,566 ms
コンパイル使用メモリ 226,372 KB
実行使用メモリ 106,064 KB
最終ジャッジ日時 2024-11-16 06:40:37
合計ジャッジ時間 8,374 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,820 KB
testcase_01 AC 2 ms
6,820 KB
testcase_02 AC 2 ms
6,816 KB
testcase_03 AC 2 ms
6,816 KB
testcase_04 AC 2 ms
6,820 KB
testcase_05 AC 2 ms
6,816 KB
testcase_06 AC 2 ms
6,820 KB
testcase_07 AC 2 ms
6,816 KB
testcase_08 AC 2 ms
6,816 KB
testcase_09 AC 2 ms
6,824 KB
testcase_10 AC 2 ms
6,816 KB
testcase_11 AC 19 ms
8,832 KB
testcase_12 AC 20 ms
9,472 KB
testcase_13 AC 14 ms
7,296 KB
testcase_14 AC 63 ms
20,864 KB
testcase_15 AC 98 ms
31,496 KB
testcase_16 AC 23 ms
9,088 KB
testcase_17 AC 300 ms
96,624 KB
testcase_18 AC 320 ms
96,392 KB
testcase_19 AC 319 ms
100,684 KB
testcase_20 AC 292 ms
94,504 KB
testcase_21 AC 317 ms
96,020 KB
testcase_22 AC 285 ms
86,276 KB
testcase_23 AC 293 ms
104,008 KB
testcase_24 AC 335 ms
103,828 KB
testcase_25 AC 343 ms
103,876 KB
testcase_26 AC 365 ms
103,884 KB
testcase_27 AC 363 ms
103,880 KB
testcase_28 AC 357 ms
103,932 KB
testcase_29 AC 324 ms
106,064 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 {
  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 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);
  }

  const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

  void solve(){
    int N, M; std::cin >> N >> M;

    graph<int64_t> g(2 * N * N);

    auto index = make_vector<int, 3>({2, N, N});

    {
      int k = 0;
      for(int i = 0; i < N; ++i){
        for(int j = 0; j < N; ++j){
          index[0][i][j] = k++;
          index[1][i][j] = k++;
        }
      }
    }

    auto cost = make_vector<int, 2>({N, N}, 0);
    for(int i = 0; i < M; ++i){
      int h, w, c; std::cin >> h >> w >> c;
      --h, --w;
      cost[h][w] = c;
    }

    for(int i = 0; i < N; ++i){
      for(int j = 0; j < N; ++j){
        for(auto [dx, dy] : dir){
          int x = i + dx;
          int y = j + dy;

          if(x < 0 or y < 0 or x >= N or y >= N) continue;

          g.add_edge(index[0][i][j], index[0][x][y], 1 + cost[x][y]);
          g.add_edge(index[1][i][j], index[1][x][y], 1 + cost[x][y]);
          g.add_edge(index[0][i][j], index[1][x][y], 1);
        }
      }
    }

    int64_t ans = dijkstra(g, {index[0][0][0]})[index[1][N - 1][N - 1]].value();

    std::cout << ans << "\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