Submission #37928

#TimeUsernameProblemLanguageResultExecution timeMemory
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...