結果

問題 No.1545 [Cherry 2nd Tune N] Anthem
ユーザー HaarHaar
提出日時 2021-06-11 22:10:38
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 646 ms / 3,000 ms
コード長 6,386 bytes
コンパイル時間 3,098 ms
コンパイル使用メモリ 228,320 KB
実行使用メモリ 221,284 KB
最終ジャッジ日時 2023-08-21 12:43:01
合計ジャッジ時間 20,684 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,380 KB
testcase_01 AC 1 ms
4,380 KB
testcase_02 AC 1 ms
4,380 KB
testcase_03 AC 1 ms
4,380 KB
testcase_04 AC 184 ms
84,684 KB
testcase_05 AC 646 ms
180,108 KB
testcase_06 AC 194 ms
68,828 KB
testcase_07 AC 176 ms
66,988 KB
testcase_08 AC 383 ms
90,728 KB
testcase_09 AC 87 ms
26,572 KB
testcase_10 AC 68 ms
23,524 KB
testcase_11 AC 287 ms
93,704 KB
testcase_12 AC 477 ms
151,692 KB
testcase_13 AC 134 ms
42,004 KB
testcase_14 AC 198 ms
87,660 KB
testcase_15 AC 28 ms
11,196 KB
testcase_16 AC 283 ms
123,444 KB
testcase_17 AC 30 ms
7,676 KB
testcase_18 AC 196 ms
33,892 KB
testcase_19 AC 245 ms
65,552 KB
testcase_20 AC 73 ms
25,256 KB
testcase_21 AC 334 ms
149,408 KB
testcase_22 AC 200 ms
71,304 KB
testcase_23 AC 123 ms
25,764 KB
testcase_24 AC 12 ms
8,708 KB
testcase_25 AC 18 ms
11,724 KB
testcase_26 AC 2 ms
4,376 KB
testcase_27 AC 12 ms
7,056 KB
testcase_28 AC 22 ms
14,584 KB
testcase_29 AC 18 ms
12,884 KB
testcase_30 AC 14 ms
9,404 KB
testcase_31 AC 20 ms
11,408 KB
testcase_32 AC 9 ms
6,896 KB
testcase_33 AC 24 ms
14,464 KB
testcase_34 AC 20 ms
11,840 KB
testcase_35 AC 67 ms
38,684 KB
testcase_36 AC 52 ms
29,288 KB
testcase_37 AC 5 ms
5,148 KB
testcase_38 AC 26 ms
14,668 KB
testcase_39 AC 7 ms
5,600 KB
testcase_40 AC 10 ms
7,672 KB
testcase_41 AC 4 ms
4,584 KB
testcase_42 AC 17 ms
9,892 KB
testcase_43 AC 19 ms
11,460 KB
testcase_44 AC 8 ms
5,736 KB
testcase_45 AC 23 ms
21,100 KB
testcase_46 AC 29 ms
15,780 KB
testcase_47 AC 50 ms
26,880 KB
testcase_48 AC 88 ms
59,824 KB
testcase_49 AC 87 ms
43,276 KB
testcase_50 AC 187 ms
76,020 KB
testcase_51 AC 8 ms
6,096 KB
testcase_52 AC 241 ms
91,856 KB
testcase_53 AC 76 ms
40,896 KB
testcase_54 AC 13 ms
8,192 KB
testcase_55 AC 177 ms
73,216 KB
testcase_56 AC 8 ms
5,964 KB
testcase_57 AC 147 ms
55,720 KB
testcase_58 AC 90 ms
44,784 KB
testcase_59 AC 16 ms
10,012 KB
testcase_60 AC 21 ms
15,704 KB
testcase_61 AC 36 ms
18,176 KB
testcase_62 AC 115 ms
45,064 KB
testcase_63 AC 52 ms
23,116 KB
testcase_64 AC 391 ms
157,772 KB
testcase_65 AC 15 ms
8,356 KB
testcase_66 AC 350 ms
221,284 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, 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.size() << "\n"
                << 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