# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
5032 | cki86201 | 결혼 문제 (IZhO14_marriage) | C++98 | 1500 ms | 2896 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
int iter[30030];
bool match(int x)
{
priority_queue <Pi, vector<Pi>, greater<Pi> >pq;
for(size_t i=iter[x];i<E[x].size();i++){
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=iter[v];i<E[v].size();i++){
if(chk[E[v][i]] == in)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++)sort(E[i].begin(), E[i].end());
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];
for(i=1;i<=m;i++)while(iter[i] != (int)E[i].size() && E[i][iter[i]]<=now)iter[i]++;
xy[yx[t]] = 0, yx[t] = 0, mat--, in++;
if(match(t))mat++;
}
printf("%d",ans);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |