Submission #1202241

#TimeUsernameProblemLanguageResultExecution timeMemory
1202241LucaIlieMarriage questions (IZhO14_marriage)C++20
66 / 100
1033 ms1216 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 3e4;
const int MAX_M = 2000;
vector<int> adj[MAX_M + 1];
bool vis[MAX_N + 1];
int pairB[MAX_N + 1];
set<int> unpaired;
int L, R;

bool pairup(int u) {
    if (u == 0)
        return true;

    if (vis[u])
        return false;

    vis[u] = true;
    for (int v: adj[u]) {
        if (v < L || v > R)
            continue;
        if (pairup(pairB[v])) {
            pairB[v] = u;
            return true;
        }
    }

    return false;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, k;

    cin >> n >> m >> k;
    for (int i = 0; i < k; i++) {
        int a, b;
        cin >> b >> a;
        adj[a].push_back(b);
    }
    
    for (int i = 1; i <= m; i++)
        unpaired.insert(i);

    int l = 1;
    long long ans = 0;
    for (int r = 1; r <= n; r++) {
        L = l;
        R = r;
        vector<int> ers;
        for (int i = 1; i <= m; i++)
            vis[i] = false;
        for (int i: unpaired) {
            if (pairup(i))
                ers.push_back(i);
        }
        for (int i: ers)
            unpaired.erase(i);

        if (unpaired.empty()) {
            while (l <= r && unpaired.empty()) {
                int i = pairB[l];
                pairB[l] = 0;
                l++;
                L = l, R = r;
                unpaired.insert(i);
                vis[i] = false;
                if (pairup(i))
                    unpaired.erase(i);
            }
            l--;
            ans += l;
       //     printf("%d %d\n", l, r);
        }
        
    }

    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...