제출 #37928

#제출 시각아이디문제언어결과실행 시간메모리
37928mirbek01결혼 문제 (IZhO14_marriage)C++14
58 / 100
1500 ms34980 KiB
# include <bits/stdc++.h>

# define pb push_back
# define fr first
# define sc second
# define mk make_pair

using namespace std;

const int inf = 1e9 + 7;
const int N = 1e6 + 5;

typedef long long ll;

int n, m, k, used[N], mt[N], lo, ri;
ll ans;
vector <int> g[N];

bool try_kuhn(int v)
{
      if(used[v]) return false;
      used[v] = 1;
      for(int to : g[v])
      {
            if((mt[to] == -1 || try_kuhn(mt[to])) && to >= lo && to <= ri)
            {
                  mt[to] = v;
                  return true;
            }
      }
      return false;
}

bool check(int l, int r)
{
      for(int i = 1; i < l; i ++)
            used[i] = 1;
      for(int i = r + 1; i <= n; i ++)
            used[i] = 1;
      for(int i = 1; i <= n + m; i ++)
            mt[i] = -1;
      lo = l, ri = r;
      for(int i = 1; i <= m; i ++)
      {
            for(int j = l; j <= r; j ++)
                  used[j] = 0;
            for(int j = 1; j <= m; j ++)
                  used[j + n] = 0;
            try_kuhn(i + n);
      }

      for(int i = l; i <= r; i ++)
      {
            if(mt[i] == -1) continue;
            mt[mt[i]] = 1;
      }

      for(int i = 1; i <= m; i ++)
            if(mt[i + n] == -1) return false;

      return true;
}

int main()
{
      cin >> n >> m >> k;

      for(int i = 1; i <= k; i ++)
      {
            int a, b;
            cin >> a >> b;
            g[a].pb(n + b);
            g[n + b].pb(a);
      }

      for(int i = 1; i <= n; i ++)
      {
            int l = i, r = n;
            while(r - l > 1)
            {
                  int md = (l + r) >> 1;
                  if(check(i, md))
                        r = md;
                  else
                        l = md;
            }

            if(check(i, l))
                  r = l;
            if(check(i, r))
                  ans += (n - r + 1);
      }

      cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...