| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 905023 | khachatur25 | Marriage questions (IZhO14_marriage) | C++14 | 0 ms | 0 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Online C++ compiler to run C++ program online#include <bits/stdc++.h>using namespace std;const int N = 32005;int n,m,k;vector<int>g[N];int a,b;bool used[N];int mt[N];bool kuhn(int v,int L,int R){    if(used[v])return false;    used[v] = true;    for(int i = 0;i < g[v].size();i++){        int to = g[v][i];        if(to < L)continue;        if(to > R)break;        if(mt[to] == -1 || kuhn(mt[to],L,R)){            mt[to] = v;            return true;        }    }    return false;}int main() {    ios_base::sync_with_stdio(false);    cin.tie(nullptr);    cin.tie(NULL);    cin >> n >> m >> k;    for(int i = 1;i <= k;i++){        scanf("%d""%d",&a,&b);        a += m;        g[a].push_back(b);        g[b].push_back(a);    }        for(int i = 1;i <= m;i++){        sort(g[i].begin(),g[i].end());    }    int ina = m, inb = n, idx = -1;    while(ina <= inb){        int mid = (ina + inb) >> 1;        for(int i = 1;i <= mid;i++){            mt[i + m] = -1;        }        int cnt = 0;        for(int i = 1;i <= m;i++){            for(int j = 1;j <= m;j++){                used[j] = false;            }            bool f = kuhn(i,1,mid + m);            if(f)cnt++;        }        if(cnt == m){            idx = mid;            inb = mid - 1;        }        else{            ina = mid - 1;        }    }    if(idx = -1){        cout << 0;        return 0;    }    for(int i = 1;i <= n;i++){        mt[i + m] = -1;    }    for(int i = 1;i <= m;i++){        for(int j = 1;j <= m;j++){            used[j] = false;        }        kuhn(i,1,idx + m);    }    int ans = n - idx + 1;    for(int i = 1;i <= n;i++){        if(mt[i + m] == -1){            ans += n - idx + 1;            continue;        }        int girl = mt[i + m];        while(idx <= n){            for(int j = 1;j <= m;j++){                used[j] = false;            }            bool f = kuhn(girl,i + 1 + m,idx + m);            if(f)break;            idx++;        }        if(idx == n + 1)break;        ans += n - idx + 1;    }    cout << ans;}
