結果
問題 |
No.3306 Life is Easy?
|
ユーザー |
![]() |
提出日時 | 2025-10-05 14:38:17 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 108 ms / 2,000 ms |
コード長 | 3,227 bytes |
コンパイル時間 | 914 ms |
コンパイル使用メモリ | 105,016 KB |
実行使用メモリ | 12,532 KB |
最終ジャッジ日時 | 2025-10-05 14:38:27 |
合計ジャッジ時間 | 2,852 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 35 |
ソースコード
// https://judge.yosupo.jp/submission/199346 #include <vector> #include <iostream> #include <algorithm> #include <string.h> typedef long long i64; using value = int; // 1-indexed namespace KM { const int N = 1510, INF = 1145141919, no = -1; int n, nl, nr; value a[N][N]; value hl[N], hr[N], slk[N]; int fl[N], fr[N], vl[N], vr[N], pre[N], q[N], ql, qr; void init_sz(int _n, int L, int R) { n = _n, nl = L, nr = R; } void clr() { memset(hl, 0, sizeof(value) * (n + 1)); memset(hr, 0, sizeof(value) * (n + 1)); memset(slk, 0, sizeof(value) * (n + 1)); memset(fl, 0, (n + 1) << 2), memset(fr, 0, (n + 1) << 2); memset(vl, 0, (n + 1) << 2), memset(vr, 0, (n + 1) << 2); memset(pre, 0, (n + 1) << 2), ql = qr = 0; } int check(int i) { if (vl[i] = 1, fl[i] != no) return vr[q[qr++] = fl[i]] = 1; while (i != no) std::swap(i, fr[fl[i] = pre[i]]); return 0; } void bfs(int s) { std::fill(slk, slk + n + 1, INF), std::fill(vl, vl + n + 1, 0), std::fill(vr, vr + n + 1, 0); for (vr[q[ql = 0] = s] = qr = 1;;) { for (value d; ql < qr;) for (int i = 1, j = q[ql++]; i <= n; ++i) if (!vl[i] && slk[i] >= (d = hl[i] + hr[j] - a[i][j])) { if (pre[i] = j, d) slk[i] = d; else if (!check(i)) return; } value d = INF; for (int i = 1; i <= n; ++i) if (!vl[i] && d > slk[i]) d = slk[i]; for (int i = 1; i <= n; ++i) { if (vl[i]) hl[i] += d; else slk[i] -= d; if (vr[i]) hr[i] -= d; } for (int i = 1; i <= n; ++i) if (!vl[i] && !slk[i] && !check(i)) return; } } void ask() { std::fill(fl, fl + n + 1, no), std::fill(fr, fr + n + 1, no), std::fill(hr, hr + n + 1, 0); for (int i = 1; i <= n; ++i) hl[i] = *(std::max_element(a[i] + 1, a[i] + n + 1)); for (int j = 1; j <= n; ++j) bfs(j); } i64 maxmatch() { ask(); i64 ans = 0; for (int i = 1; i <= nl; ++i) ans += a[i][fl[i]]; return ans; } } int main() { int h, w; std::cin >> h >> w; if (h == 1) { std::cout << 0 << std::endl; return 0; } const int n = h / 2; KM::init_sz(n, n, n); std::vector<std::vector<int>> a(w); for (auto &x : a) x.resize(h); for (int i = 0; i < h; ++i) { for (int j = 0; j < w; ++j) { std::cin >> a[j][i]; } } for (int i = 0; i < n; ++i) { for (int j = 0 ; j < n; ++j) { int val = 0; for (const auto &x : a) { val = std::max(val, x[h - 1 - j] - x[i]); } KM::a[i + 1][j + 1] = val; } } std::cout << KM::maxmatch() << std::endl; return 0; }