题意
给出一个 N 行 M 列的矩阵A, 保证满足以下性质:
1. M>N 。
2. 矩阵中每个数都是 [0,N] 中的自然数。
3. 每行中, [1,N] 中每个自然数都恰好出现一次。这意味着每行中 0 恰好出现 M−N 次。
4. 每列中,[1,N] 中每个自然数至多出现一次。
现在我们要在每行中选取一个非零数,并把这个数之后的数赋值为这个数。我们希望保持上面的性质4,即每列中,[1,N] 中每个自然数仍然至多出现一次。
【explanation】
两组输入数据是相同的。由于结果不唯一,你可以给出任意一组合法答案。
【限制与约定】
对于 20% 的数据,M<8,T<8 。
对于 40% 的数据,N<8,T<8 。
对于 100% 的数据,N<200,M<400,T<50 。
卖萌表情包括但不限于“ $ ^o^)/” (不含引号).
由于输入数据较大, 请自行优化输入方法.
题解
先考虑比较特殊的位置,比如最后一列,就发现每行要选的数必须是互不相同的,即转化为求
1
−
n
1-n
1−n行与数
1
−
n
1-n
1−n的一个合法匹配。
设第
i
i
i行匹配的数为
p
i
p_i
pi,出现在
p
o
s
i
pos_i
posi列,考虑怎样的匹配合法。对于
a
i
,
j
a_{i,j}
ai,j,如果有一行
j
j
j,
p
[
j
]
=
a
[
i
]
[
j
]
p[j]=a[i][j]
p[j]=a[i][j],且
p
o
s
[
j
]
≤
j
pos[j] \le j
pos[j]≤j,这样如果
a
[
i
]
[
j
]
a[i][j]
a[i][j]没有该行被前面的数覆盖则不合法。
发现该限制是一个稳定婚姻匹配问题,直接做即可。