結果

問題 No.1545 [Cherry 2nd Tune N] Anthem
ユーザー HaarHaar
提出日時 2021-06-11 22:08:07
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 6,350 bytes
コンパイル時間 3,492 ms
コンパイル使用メモリ 229,576 KB
実行使用メモリ 221,512 KB
最終ジャッジ日時 2024-05-08 17:56:07
合計ジャッジ時間 20,496 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 AC 2 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 212 ms
84,712 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 AC 219 ms
66,864 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 83 ms
23,748 KB
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
testcase_35 WA -
testcase_36 WA -
testcase_37 WA -
testcase_38 WA -
testcase_39 WA -
testcase_40 WA -
testcase_41 WA -
testcase_42 WA -
testcase_43 WA -
testcase_44 WA -
testcase_45 AC 24 ms
21,156 KB
testcase_46 WA -
testcase_47 WA -
testcase_48 WA -
testcase_49 WA -
testcase_50 WA -
testcase_51 WA -
testcase_52 WA -
testcase_53 WA -
testcase_54 WA -
testcase_55 WA -
testcase_56 WA -
testcase_57 WA -
testcase_58 WA -
testcase_59 WA -
testcase_60 WA -
testcase_61 WA -
testcase_62 WA -
testcase_63 WA -
testcase_64 WA -
testcase_65 WA -
testcase_66 WA -
権限があれば一括ダウンロードができます

ソースコード

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, int src, int dst) {
    using P = std::pair<T, int>;

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

    std::vector<int> restore(n, -1);

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

    dist[src] = 0;
    pq.emplace(0, src);

    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;
          restore[e.to] = i;
          pq.emplace(*dist[e.to], e.to);
        } else {
          if (*dist[e.to] > d + e.cost) {
            dist[e.to] = d + e.cost;
            restore[e.to] = i;
            if (not check[e.to]) pq.emplace(*dist[e.to], e.to);
          }
        }
      }
    }

    std::vector<int> path;

    if (dist[dst]) {
      int cur = dst;
      while (cur != -1) {
        path.push_back(cur);
        cur = restore[cur];
      }
      std::reverse(path.begin(), path.end());
    }

    return std::make_pair(dist[dst], path);
  }
}  // 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);
  }

  constexpr int in = 0;
  constexpr int out = 1;

  void solve() {
    int N, S, T, K; std::cin >> N >> S >> T >> K;
    --S, --T;

    std::vector<int> X(N); std::cin >> X;

    int M; std::cin >> M;
    std::vector<int> A(M), B(M), Y(M);
    for (int i = 0; i < M; ++i) {
      std::cin >> A[i] >> B[i] >> Y[i];
      --A[i], --B[i];
    }

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

    auto index = make_vector<int, 3>({N, K, 2});
    auto rindex = std::vector<int>(N * K * 2);
    {
      int k = 0;
      for (int i = 0; i < N; ++i) {
        for (int j = 0; j < K; ++j) {
          rindex[k] = i;

          index[i][j][in] = k++;
          index[i][j][out] = k++;
        }
      }
    }

    for (int i = 0; i < N; ++i) {
      for (int j = 0; j < K; ++j) {
        g.add_edge(index[i][j][in], index[i][j][out], X[i]);
      }
    }

    for (int i = 0; i < M; ++i) {
      for (int j = 0; j < K - 1; ++j) {
        g.add_edge(index[A[i]][j][out], index[B[i]][j + 1][in], Y[i]);
      }

      g.add_edge(index[A[i]][K - 1][out], index[B[i]][K - 1][in], Y[i]);
    }

    auto [dist, path] = dijkstra(g, index[S][0][in], index[T][K - 1][out]);

    if (dist) {
      std::cout << "Possible\n";
      std::cout << *dist << "\n";
      std::vector<int> p;
      for (int i = 0; i < (int) path.size(); i += 2) {
        p.push_back(rindex[path[i]] + 1);
      }

      std::cout << p << "\n";
    }
    else {
      std::cout << "Impossible\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