#P14804. [Bulgarian2018组队赛]poll
[Bulgarian2018组队赛]poll
题目描述
国际足联(FIFA)正在进行一年一度最佳足球运动员的评选。正如现代民主时代常见的做法一样,球员为球员投票。
共有 N 名球员,来自 K 个国家。球员编号为 1 到 N,国家编号为 1 到 K。每位受访球员恰好给这 N 名球员中的某一位投一票,即这 N 名球员互相投票选出最佳球员。
对于一名球员来说,他可以给任意国家的球员投票;可以有多个球员投给同一个人;球员也可以投给自己。
由于某些神秘的统计学原因,FIFA 总部提出了如下任务:对每个国家的球员,都要把他们划分成若干个互不相交的组,使得:
- 每个球员恰好属于一个组;
- 同一个组中的所有球员,必须都只投给同一个组中的球员(这个目标组可以来自同一国家,也可以来自其他国家);
- 最终得到的组总数要尽可能少。
请编写程序 poll,求出一个满足条件且组数最少的划分方案。(FIFA 承诺会有一份不错的奖励🙂)
输入格式
第一行输入两个正整数 N 和 K,分别表示球员数和国家数。
接下来 K 行,对应编号为 1..K 的各个国家。
第 i 个这样的输入行(这里的行号是从输入文件第二行开始算)首先给出一个整数,表示该国家球员的数量;随后给出该国家所有球员的编号。行内所有数均以空格分隔。
最后一行输入 N 个正整数。其中第 j 个数表示:编号为 j 的球员投给了哪位球员。
输出格式
第一行输出一个正整数 M,表示将全部球员划分后得到的组数。
接下来 M 行,第 i 行输出第 i 个组的成员:
- 行首先输出该组球员数量;
- 然后输出该组所有球员编号。
行内各整数之间用一个空格分隔。
组的输出顺序无关紧要;同一组内球员编号的输出顺序也无关紧要。
如果存在多个解,可以输出任意一个。
限制
1 ≤ N ≤ 1000001 ≤ K ≤ N
在 35% 的测试中,N ≤ 2000。
评分说明
测试按两两成组的方式评分。要拿到某一对测试的分数,必须同时通过该对中的两个测试。
示例
输入
12 2
6 1 2 3 10 4 5
6 7 8 9 12 6 11
4 5 6 7 8 9 2 1 3 11 12 3
输出
6
2 4 5
2 6 11
2 9 12
2 1 2
2 3 10
2 8 7
样例解释
共有 12 名球员,来自 2 个国家。原题下方配图中展示了:
- 左半边:每名球员属于哪个国家,以及每个人投给了谁;
- 右半边:将 12 名球员划分成 6 个组的一种最优方案。
请注意:
- 每个组都只包含同一个国家的球员;
- 没有任何球员被遗漏;
- 同一组中的球员都投给同一个组中的球员。
图片说明

左侧展示两个国家中的球员及投票箭头,右侧展示划分后的 6 个分组。