結果

問題 No.957 植林
ユーザー noshi91noshi91
提出日時 2019-12-19 22:30:45
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 7,274 bytes
コンパイル時間 905 ms
コンパイル使用メモリ 90,624 KB
実行使用メモリ 15,600 KB
最終ジャッジ日時 2024-07-07 01:57:34
合計ジャッジ時間 44,696 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,812 KB
testcase_01 AC 2 ms
6,944 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 AC 114 ms
12,780 KB
testcase_04 AC 264 ms
12,288 KB
testcase_05 AC 41 ms
12,696 KB
testcase_06 AC 839 ms
13,504 KB
testcase_07 AC 108 ms
13,032 KB
testcase_08 AC 35 ms
13,440 KB
testcase_09 AC 34 ms
12,816 KB
testcase_10 AC 37 ms
13,632 KB
testcase_11 AC 35 ms
12,680 KB
testcase_12 AC 35 ms
13,220 KB
testcase_13 AC 31 ms
12,820 KB
testcase_14 AC 40 ms
13,392 KB
testcase_15 AC 34 ms
12,916 KB
testcase_16 AC 30 ms
12,252 KB
testcase_17 AC 32 ms
12,260 KB
testcase_18 AC 1,183 ms
12,724 KB
testcase_19 AC 1,297 ms
12,968 KB
testcase_20 AC 1,339 ms
13,100 KB
testcase_21 AC 1,545 ms
13,264 KB
testcase_22 TLE -
testcase_23 AC 1,684 ms
14,436 KB
testcase_24 AC 1,880 ms
13,988 KB
testcase_25 TLE -
testcase_26 AC 1,853 ms
14,776 KB
testcase_27 AC 1,830 ms
15,600 KB
testcase_28 TLE -
testcase_29 AC 1,723 ms
14,904 KB
testcase_30 TLE -
testcase_31 AC 1,208 ms
13,124 KB
testcase_32 AC 1,324 ms
13,224 KB
testcase_33 AC 1,375 ms
13,104 KB
testcase_34 AC 1,554 ms
13,128 KB
testcase_35 TLE -
testcase_36 AC 1,677 ms
14,440 KB
testcase_37 AC 1,924 ms
14,700 KB
testcase_38 TLE -
testcase_39 AC 1,838 ms
15,032 KB
testcase_40 AC 1,838 ms
15,440 KB
testcase_41 AC 29 ms
14,776 KB
testcase_42 AC 27 ms
14,904 KB
testcase_43 AC 285 ms
15,292 KB
testcase_44 AC 322 ms
15,032 KB
testcase_45 AC 2 ms
6,944 KB
testcase_46 AC 2 ms
6,944 KB
testcase_47 AC 1 ms
6,944 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

//#define NDEBUG
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <utility>
#include <vector>

namespace n91 {

using i8 = std::int_fast8_t;
using i32 = std::int_fast32_t;
using i64 = std::int_fast64_t;
using u8 = std::uint_fast8_t;
using u32 = std::uint_fast32_t;
using u64 = std::uint_fast64_t;
using isize = std::ptrdiff_t;
using usize = std::size_t;

struct rep {
  struct itr {
    usize i;
    constexpr itr(const usize i) noexcept : i(i) {}
    void operator++() noexcept { ++i; }
    constexpr usize operator*() const noexcept { return i; }
    constexpr bool operator!=(const itr x) const noexcept { return i != x.i; }
  };
  const itr f, l;
  constexpr rep(const usize f, const usize l) noexcept
      : f(std::min(f, l)), l(l) {}
  constexpr auto begin() const noexcept { return f; }
  constexpr auto end() const noexcept { return l; }
};
struct revrep {
  struct itr {
    usize i;
    constexpr itr(const usize i) noexcept : i(i) {}
    void operator++() noexcept { --i; }
    constexpr usize operator*() const noexcept { return i; }
    constexpr bool operator!=(const itr x) const noexcept { return i != x.i; }
  };
  const itr f, l;
  constexpr revrep(const usize f, const usize l) noexcept
      : f(l - 1), l(std::min(f, l) - 1) {}
  constexpr auto begin() const noexcept { return f; }
  constexpr auto end() const noexcept { return l; }
};
template <class T> auto md_vec(const usize n, const T &value) {
  return std::vector<T>(n, value);
}
template <class... Args> auto md_vec(const usize n, Args... args) {
  return std::vector<decltype(md_vec(args...))>(n, md_vec(args...));
}
template <class T> constexpr T difference(const T &a, const T &b) noexcept {
  if (a < b) {
    return b - a;
  } else {
    return a - b;
  }
}
template <class T> void chmin(T &a, const T &b) noexcept {
  if (b < a) {
    a = b;
  }
}
template <class T> void chmax(T &a, const T &b) noexcept {
  if (a < b) {
    a = b;
  }
}
template <class F> class fix_point : private F {
public:
  explicit constexpr fix_point(F &&f) : F(std::forward<F>(f)) {}

  template <class... Args>
  constexpr decltype(auto) operator()(Args &&... args) const {
    return F::operator()(*this, std::forward<Args>(args)...);
  }
};
template <class F> constexpr decltype(auto) make_fix(F &&f) {
  return fix_point<F>(std::forward<F>(f));
}
template <class T> T scan() {
  T ret;
  std::cin >> ret;
  return ret;
}

} // namespace n91

#ifndef NIMI_GRAPH
#define NIMI_GRAPH

#include <vector>

namespace nimi {
  struct base_edge {
    int from;
    int to;
    base_edge(int from, int to) : from(from), to(to) {  }
  };

  template<class T>
    struct edge : public base_edge {
      T val;
      edge(int from, int to, T v) : base_edge(from, to), val(v) {  }
    };

  template<>
    struct edge<void> : public base_edge {
      edge(int from, int to) : base_edge(from , to) {  }
    };
  template<class C>
  struct maxflow_edge : public base_edge {
    C cap;
    std::size_t rev;
    maxflow_edge(int from, int to, C cap, std::size_t rev)
      : base_edge(from, to), cap(cap), rev(rev) {  }
  };

  template<class C>
  struct mcf_edge : public base_edge {
    C cap;
    C cost;
    std::size_t rev;
    mcf_edge(int from, int to, C cap, C cost, std::size_t rev)
      : base_edge(from, to), cap(cap), cost(cost), rev(rev) {  }
  };

  template<class T>
  struct directed_graph : public std::vector<std::vector<edge<T>>> {
    directed_graph(std::size_t n): std::vector<std::vector<edge<T>>>(n) { }
    void add_edge(const edge<T>& e) { this->at(e.from).push_back(e); }
  };

  template<class T>
  struct undirected_graph : public std::vector<std::vector<edge<T>>> {
    undirected_graph(std::size_t n): std::vector<std::vector<edge<T>>>(n) { }
    void add_edge(const edge<T>& e) { 
      this->at(e.from).push_back(e);
      edge<T> re = e;
      std::swap(re.from, re.to);
      this->at(e.to).push_back(re); 
    }
  };

  template<class C>
  struct maxflow_graph : public std::vector<std::vector<maxflow_edge<C>>> {
    maxflow_graph(std::size_t n): std::vector<std::vector<maxflow_edge<C>>>(n) {  }
    void add_edge(int from, int to, C cap, std::size_t rev_cap = 0) {
      this->at(from).push_back(maxflow_edge<C>(from, to, cap, this->at(to).size()));
      this->at(to).push_back(maxflow_edge<C>(to, from, rev_cap, this->at(from).size() - 1));
    }
  };

  template<class C>
  struct mcf_graph : public std::vector<std::vector<mcf_edge<C>>> {
    mcf_graph(std::size_t n) : std::vector<std::vector<mcf_edge<C>>>(n) {  } 
    void add_edge(int from, int to, C cap, C cost, std::size_t rev_cap = 0) {
      this->at(from).push_back(mcf_edge<C>(from, to, cap, cost, this->at(to).size()));
      this->at(to).push_back(mcf_edge<C>(to, from, rev_cap, -cost, this->at(from).size() - 1));
    }
  };
}

#endif
#ifndef NIMI_GRAPH_MAXFLOW_FIFOPR
#define NIMI_GRAPH_MAXFLOW_FIFOPR

#include <queue>
#include <vector>

namespace nimi {
  template<class C>
  C fifo_push_relabel(nimi::maxflow_graph<C>& g, std::size_t s, std::size_t t) {
    std::queue<int> que;
    std::size_t n = g.size();
    std::vector<C> ex(n);
    std::vector<int> d(n, 1);
    d[s] = n;
    d[t] = 0;
    C ZERO = C();

    for(auto& e: g[s]) {
      if(e.to != t && e.to != s && ex[e.to] == ZERO && e.cap > ZERO) {
        que.push(e.to);
      }
      ex[e.to] += e.cap;
      g[e.to][e.rev].cap = e.cap;
      e.cap = ZERO;
    }

    while(!que.empty()) {
      int v = que.front();
      que.pop();
      while(ex[v] > ZERO) {
        bool admissible = false;
        for(auto& e: g[v]) {
          if(d[v] == d[e.to] + 1 && e.cap > ZERO) {
            admissible = true;
            C delta = std::min(ex[v], e.cap);
            if(e.to != t && e.to != s && ex[e.to] == ZERO && delta > ZERO) {
              que.push(e.to);
            }
            ex[v] -= delta;
            ex[e.to] += delta;
            e.cap -= delta;
            g[e.to][e.rev].cap += delta;
          }
        }
        if(!admissible) {
          d[v] = n + 1;
          for(auto& e: g[v]) {
            if(e.cap > ZERO) {
              d[v] = std::min(d[v], d[e.to] + 1);
            }
          }
          if(v != s && v != t && ex[v] > ZERO && d[v] < n + 1) {
            que.push(v);
          }
          else {
            break;
          }
        }
      }
    }
    return ex[t];
  }
}

#endif

#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>

namespace n91 {

void main_() {
  /*
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  //*/
  const usize h = scan<usize>();
  const usize w = scan<usize>();
  nimi::maxflow_graph<u64> g(h + w + 2);
  const usize s = h + w;
  const usize t = h + w + 1;
  for (const usize i : rep(0, h)) {
    for (const usize j : rep(0, w)) {
      const u64 c = scan<u64>();
      g.add_edge(i, h + j, c);
      g.add_edge(s, i, c);
    }
  }
  u64 ans = 0;
  for (const usize i : rep(0, h)) {
    const u64 c = scan<u64>();
    ans += c;
    g.add_edge(i, t, c);
  }
  for (const usize i : rep(0, w)) {
    const u64 c = scan<u64>();
    ans += c;
    g.add_edge(h + i, t, c);
  }
  std::cout << ans - nimi::fifo_push_relabel(g, s, t) << std::endl;
}

} // namespace n91

int main() {
  n91::main_();
  return 0;
}
0