U192222 匹配

题目描述

有 $n$ 位毕业生(编号为 $1...n$)正在找工作,同时有 $n$ 家公司(编号为 $1...n$)正在招聘。 每位毕业生心中有一个公司排名,排名越靠前代表他对这个公司越感兴趣;这个排名由二维数组 $f$ 给出,$f[i][j]$ 代表在毕业生 $i$ 心中排名第 $j$ 位的公司编号。 例如 $n=3$: ```cpp f = [2,3,1 1,2,3 2,1,3] ``` 则对于 $1$ 号毕业生来说,公司排名为 $f[1] = [2,3,1]$,代表 $2$ 号公司最佳,$3$ 号公司次之,$1$ 号公司最差;对于 $2$ 号毕业生来说,公司排名为 $f[2] = [1,2,3]$;对于 $3$ 号毕业生来说,公司排名为 $f[3] = [2,1,3]$。 同时,每个公司有一个毕业生排名,排名越靠前代表公司认为这个毕业生越优秀。这个排名的由二维数组 $g$ 给出。 最终的目的是让公司和毕业生一一配对(一位毕业生选择恰好一个公司),设当前和 $i$ 号公司配对的毕业生为 $h[i]$,初始 $h[i]$ 都为 0(所有公司全部未配对)。 现在所有毕业生和公司达成协议,他们将重复以下流程,直到配对完成(所有 $h[i] \ne 0$ ): 1. 遍历所有毕业生,若 $i$ 号毕业生还没有和任何公司配对,则他会向仍未拒绝过他的公司中最优秀( $f[i]$ 中最靠前的)的公司发出工作申请。 2. 遍历所有公司,若 $i$ 号公司本轮中收到申请,则选出其中最优秀的一个人选($g[i]$ 中最靠前的),设其为 $x$。首先公司向除了 $x$ 之外的本轮申请者发出拒绝,然后进行判断: - 若 $h[i]=0$,则令 $h[i]=x$,即 $i$ 号公司和 $x$ 号毕业生配对; - 若 $h[i]\ne 0$,且 $h[i]$ 的排名比 $x$ 靠后,则公司取消之前的配对,转而和 $x$ 配对:$h[i]=x$,同时 $i$ 公司向毕业生 $h[i]$ 发出拒绝; - 若 $h[i]\ne 0$,且 $h[i]$ 的排名比 $x$ 靠前,则 $i$ 公司向毕业生 $x$ 发出拒绝; 3. 此时若所有 $h[i] \ne 0$ ,则结束;否则回到步骤1。 给定 $f,g$ 两个二维数组,请你编程实现上述过程,输出最终的配对方案 $h[1...n]$。

输入格式

输入一行2个整数,代表 $n$ 和随机种子 $seed$ 为了避免输入量过大超时,本题采用以下方式进行输入(你可以复制下面代码作为输入部分) ```cpp int n,seed; cin>>n>>seed; srand(seed); for(int i=1;i

输出格式

输出一行 $n$ 个整数,代表 $h[1...n]$

说明/提示

样例1中 $n=3$: ```cpp f = [2,1,3, 1,2,3, 2,1,3] g = [3,1,2, 2,3,1, 1,2,3] ``` 第一轮开始时,$h=[0,0,0]$: - $1$ 号毕业生向 $2$ 号公司发出申请 - $2$ 号毕业生向 $1$ 号公司发出申请 - $3$ 号毕业生向 $2$ 号公司发出申请 - $1$ 号公司和 $2$ 号毕业生达成配对 - $2$ 号公司和 $3$ 号毕业生达成配对,向 $1$ 号毕业生发出拒绝 第二轮开始时,$h=[2,3,0]$: - $1$ 号毕业生向 $1$ 号公司发出申请 - $1$ 号公司进行比较,$g[1] = [3,1,2]$,$1$ 号比当前 $h[1] = 2$ 排名更靠前,$1$ 号公司和 $1$ 号毕业生达成配对,向 $2$ 号毕业生发出拒绝 第三轮开始时,$h=[1,3,0]$: - $2$ 号毕业生向 $2$ 号公司发出申请 - $2$ 号公司进行比较,$g[2] = [2,3,1]$,$2$ 号比当前 $h[2] = 3$ 排名更靠前,$2$ 号公司和 $2$ 号毕业生达成配对,向 $3$ 号毕业生发出拒绝 第四轮开始时,$h=[1,2,0]$: - $3$ 号毕业生向 $1$ 号公司发出申请 - $1$ 号公司进行比较,$g[2] = [3,1,2]$,$3$ 号比当前 $h[1] = 1$ 排名更靠前,$1$ 号公司和 $3$ 号毕业生达成配对,向 $1$ 号毕业生发出拒绝 第五轮开始时,$h=[3,2,0]$: - $1$ 号毕业生向 $3$ 号公司发出申请 - $3$ 号公司和 $1$ 号毕业生达成配对 第五轮结束后$h=[3,2,1]$,完成一一配对。 【数据范围】 对于所有测试点,$1\le n\le 5000, 0\le seed\le 10^9$,输入方式保证了 $f,g$ 数组中的每行都是 $1,2,...,n$ 的排列 子任务1(20分):$1\le n\le 10$ 子任务2(20分):$1\le n\le 50$ 子任务3(20分):$1\le n\le 500$ 子任务4(20分):$1\le n\le 1000$ 子任务5(20分):$1\le n\le 5000$