結果
問題 | No.3071 玉虫色着色 |
ユーザー | 👑 hos.lyric |
提出日時 | 2020-07-28 23:27:04 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 20 ms / 2,000 ms |
コード長 | 3,571 bytes |
コンパイル時間 | 1,287 ms |
コンパイル使用メモリ | 104,708 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-28 21:06:59 |
合計ジャッジ時間 | 11,599 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 20 ms
5,248 KB |
testcase_01 | AC | 6 ms
5,376 KB |
testcase_02 | AC | 5 ms
5,376 KB |
testcase_03 | AC | 5 ms
5,376 KB |
testcase_04 | AC | 5 ms
5,376 KB |
testcase_05 | AC | 4 ms
5,376 KB |
testcase_06 | AC | 4 ms
5,376 KB |
testcase_07 | AC | 8 ms
5,376 KB |
testcase_08 | AC | 9 ms
5,376 KB |
testcase_09 | AC | 9 ms
5,376 KB |
testcase_10 | AC | 8 ms
5,376 KB |
testcase_11 | AC | 8 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
evil_large1.txt | AC | 216 ms
7,364 KB |
evil_large2.txt | AC | 113 ms
8,580 KB |
ソースコード
#include <cassert> #include <cmath> #include <cstdint> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <bitset> #include <complex> #include <deque> #include <functional> #include <iostream> #include <map> #include <numeric> #include <queue> #include <set> #include <sstream> #include <string> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> using namespace std; using Int = long long; template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } namespace MF { const int LIM_N = 200010; const int LIM_M = 200010; typedef int wint; const wint wEPS = 0; const wint wINF = 1001001001; int n, m, ptr[LIM_N], nxt[LIM_M * 2], zu[LIM_M * 2]; wint capa[LIM_M * 2], tof; int lev[LIM_N], see[LIM_N], que[LIM_N], *qb, *qe; void init(int _n) { n = _n; m = 0; fill(ptr, ptr + n, -1); } void ae(int u, int v, wint w0, wint w1 = 0) { nxt[m] = ptr[u]; ptr[u] = m; zu[m] = v; capa[m] = w0; ++m; nxt[m] = ptr[v]; ptr[v] = m; zu[m] = u; capa[m] = w1; ++m; } wint augment(int src, int ink, wint flo) { if (src == ink) return flo; for (int &i = see[src]; ~i; i = nxt[i]) if (capa[i] > wEPS && lev[src] < lev[zu[i]]) { const wint f = augment(zu[i], ink, min(flo, capa[i])); if (f > wEPS) { capa[i] -= f; capa[i ^ 1] += f; return f; } } return 0; } bool solve(int src, int ink, wint flo = wINF) { for (tof = 0; tof + wEPS < flo; ) { qb = qe = que; fill(lev, lev + n, -1); for (lev[*qe++ = src] = 0, see[src] = ptr[src]; qb != qe; ) { const int u = *qb++; for (int i = ptr[u]; ~i; i = nxt[i]) if (capa[i] > wEPS) { const int v = zu[i]; if (lev[v] == -1) { lev[*qe++ = v] = lev[u] + 1; see[v] = ptr[v]; if (v == ink) goto au; } } } return false; au: for (wint f; (f = augment(src, ink, flo - tof)) > wEPS; tof += f); } return true; } } int L, R, M; vector<int> A, B; int main() { for (; ~scanf("%d%d%d", &L, &R, &M); ) { A.resize(M); B.resize(M); for (int i = 0; i < M; ++i) { scanf("%d%d", &A[i], &B[i]); B[i] += L; } int color; vector<int> ans(M, -1); for (color = 0; ; ++color) { vector<int> deg(L + R, 0); for (int i = 0; i < M; ++i) { if (ans[i] == -1) { ++deg[A[i]]; ++deg[B[i]]; } } const int minDeg = *min_element(deg.begin(), deg.end()); if (minDeg == 0) { break; } MF::init(L + R + 2); vector<int> ids(M, -1); for (int u = 0; u < L; ++u) { MF::ae(L + R + 0, u, deg[u] - minDeg + 1); } for (int v = L; v < L + R; ++v) { MF::ae(v, L + R + 1, deg[v] - minDeg + 1); } for (int i = 0; i < M; ++i) { if (ans[i] == -1) { ids[i] = MF::m; MF::ae(A[i], B[i], 1); } } MF::solve(L + R + 0, L + R + 1); for (int i = 0; i < M; ++i) { if (ans[i] == -1) { if (MF::capa[ids[i]] == 0) { ans[i] = color; } } } } printf("%d\n", color); for (int i = 0; i < M; ++i) { printf("%d\n", ans[i]); } } return 0; }