| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 5031 | cki86201 | Marriage questions (IZhO14_marriage) | C++98 | 1500 ms | 2780 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.
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
//for 72 point, O(NK+NM lg K);
typedef pair<int,int> Pi;
#define X first
#define Y second
vector <int> E[2020];
int n, m, mat, ans, now, mx;
int xy[30030], yx[2020], prev[30030];
int chk[30030], in;
bool match(int x)
{
	priority_queue <Pi, vector<Pi>, greater<Pi> >pq;
	for(size_t i=0;i<E[x].size();i++){
		if(E[x][i] > now){
			chk[E[x][i]] = in;
			pq.push(Pi(E[x][i],x));
			prev[E[x][i]] = -1;
		}
	}
	while(!pq.empty()){
		Pi tmp = pq.top();
		pq.pop();
		if(!xy[tmp.X]){
			mx = max(mx, tmp.X);
			int s = tmp.X, e = tmp.Y;
			while(e!=-1){
				int save = yx[e];
				xy[s]=e, yx[e]=s;
				e=prev[s], s=save;
			}
			return true;
		}
		int v = xy[tmp.X];
		for(size_t i=0;i<E[v].size();i++){
			if(chk[E[v][i]] == in || E[v][i] <= now)continue;
			chk[E[v][i]] = in;
			pq.push(Pi(E[v][i],v));
			prev[E[v][i]] = tmp.Y;
		}
	}
	return false;
}
int main()
{
	int k, i;
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=k;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		E[y].push_back(x);
	}
	for(i=1;i<=m;i++)if(match(in=i))mat++;
	while(mat==m){
		int t = min_element(yx+1,yx+1+m) - yx;
		ans += (yx[t] - now) * (n - mx + 1);
		now = yx[t];
		xy[yx[t]] = 0, yx[t] = 0, mat--, in++;
		if(match(t))mat++;
	}
	printf("%d",ans);
	return 0;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
