CF1765A Access Levels
题目描述
BerSoft 是 Berland 最大的 IT 公司,Monocarp 是其安全部门的负责人。这一次,他遇到了有史以来最困难的任务。
具体来说,BerSoft 有 $n$ 名开发者,编号从 $1$ 到 $n$。内部网络上有 $m$ 份文档,编号从 $1$ 到 $m$。有一张访问需求表 $a$,其中 $a_{i,j}$(第 $i$ 行第 $j$ 个元素)为 $1$ 表示第 $i$ 个开发者应当有权访问第 $j$ 个文档,为 $0$ 表示不应有权访问。
为了限制访问,Monocarp 将执行以下操作:
- 选择访问组的数量 $k \ge 1$;
- 为每份文档分配一个访问组(编号为 $1$ 到 $k$ 的整数)和所需的访问等级($1$ 到 $10^9$ 的整数);
- 为每位开发者分配 $k$ 个整数值(每个值在 $1$ 到 $10^9$ 之间),表示其在每个访问组的访问等级。
如果某开发者 $i$ 在某文档 $j$ 所属访问组的访问等级大于等于该文档的所需访问等级,则该开发者可以访问该文档。
请问 Monocarp 至少需要多少个访问组,才能通过分配访问组和访问等级,使得所有访问需求表中的要求都被满足?
输入格式
第一行包含两个整数 $n$ 和 $m$($1 \le n, m \le 500$),分别表示开发者数量和文档数量。
接下来的 $n$ 行,每行包含一个长度为 $m$ 的二进制字符串,表示访问需求表。第 $i$ 行第 $j$ 个字符为 $1$ 表示第 $i$ 个开发者应有权访问第 $j$ 个文档,为 $0$ 表示不应有权访问。
输出格式
第一行输出一个整数 $k$,表示 Monocarp 至少需要选择的访问组数量。
第二行输出 $m$ 个整数,范围为 $1$ 到 $k$,表示每份文档所属的访问组。
第三行输出 $m$ 个整数,范围为 $1$ 到 $10^9$,表示每份文档的所需访问等级。
接下来的 $n$ 行,每行输出 $k$ 个整数,范围为 $1$ 到 $10^9$,表示每位开发者在每个访问组的访问等级。
如果有多组解,输出任意一组均可。
说明/提示
在第一个样例中,我们将两份文档分配到不同的访问组。两份文档在各自的访问组中都设为等级 $2$。这样,需要访问的开发者可以分配等级 $2$,不需要访问的开发者分配等级 $1$。
如果将两份文档分配到同一个访问组,则无法为开发者 $1$ 和 $3$ 分配合适的访问等级。开发者 $1$ 在该组中应比开发者 $3$ 的等级低,才能无法访问文档 $1$;同时,开发者 $3$ 在该组中又应比开发者 $1$ 的等级低,才能无法访问文档 $2$。由于两者不可能互相都比对方低,因此只用一个访问组是不可能的。
在第二个样例中,可以将所有文档分配到同一个访问组。
由 ChatGPT 4.1 翻译