| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 990219 | MilosMilutinovic | 결혼 문제 (IZhO14_marriage) | C++14 | 442 ms | 2152 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  vector<vector<int>> g(m);
  for (int i = 0; i < k; i++) {
    int a, b;
    cin >> a >> b;
    --a; --b;
    g[b].push_back(a);
  }
  for (int i = 0; i < m; i++) {
    sort(g[i].begin(), g[i].end());
  }
  vector<int> par(n, -1);
  vector<int> mtc(m, -1);
  vector<int> dfn(m);
  int ptr = -1;
  int T = 0;
  function<bool(int)> Match = [&](int v) {
    if (dfn[v] == T) {
      return false;
    }
    dfn[v] = T;
    for (int u : g[v]) {
      if (u > ptr) {
        continue;
      }
      if (par[u] == -1 || Match(par[u])) {
        par[u] = v;
        mtc[v] = u;
        return true;
      }
    }
    return false;
  };
  long long res = 0;
  vector<int> que;
  for (int i = 0; i < m; i++) {
    que.emplace_back(i);
  }
  for (int i = 0; i < n; i++) {
    while (ptr + 1 < n && !que.empty()) {
      ptr += 1;
      while (!que.empty()) {
        T += 1;
        int v = que.back();
        if (Match(v)) {
          que.pop_back();
        } else {
          break;
        }
      }
    }
    if (que.empty()) {
      res += n - ptr;
    }
    if (par[i] != -1) {
      for (int j = 0; j < m; j++) {
        if (!g[j].empty() && g[j][0] == i) {
          vector<int> new_g;
          for (int k = 1; k < (int) g[j].size(); k++) {
            new_g.push_back(g[j][k]);
          }
          g[j] = new_g;
        }
      }
      T += 1;
      mtc[par[i]] = -1;
      Match(par[i]);
      if (mtc[par[i]] == -1) {
        que.push_back(par[i]);
        mtc[par[i]] = -1;
      }
    }
  }
  cout << res << '\n';
  return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
