#P14804. [Bulgarian2018组队赛]poll

[Bulgarian2018组队赛]poll

题目描述

国际足联(FIFA)正在进行一年一度最佳足球运动员的评选。正如现代民主时代常见的做法一样,球员为球员投票。

共有 N 名球员,来自 K 个国家。球员编号为 1N,国家编号为 1K。每位受访球员恰好给这 N 名球员中的某一位投一票,即这 N 名球员互相投票选出最佳球员。

对于一名球员来说,他可以给任意国家的球员投票;可以有多个球员投给同一个人;球员也可以投给自己。

由于某些神秘的统计学原因,FIFA 总部提出了如下任务:对每个国家的球员,都要把他们划分成若干个互不相交的组,使得:

  • 每个球员恰好属于一个组;
  • 同一个组中的所有球员,必须都只投给同一个组中的球员(这个目标组可以来自同一国家,也可以来自其他国家);
  • 最终得到的组总数要尽可能少。

请编写程序 poll,求出一个满足条件且组数最少的划分方案。(FIFA 承诺会有一份不错的奖励🙂)


输入格式

第一行输入两个正整数 NK,分别表示球员数和国家数。

接下来 K 行,对应编号为 1..K 的各个国家。

i 个这样的输入行(这里的行号是从输入文件第二行开始算)首先给出一个整数,表示该国家球员的数量;随后给出该国家所有球员的编号。行内所有数均以空格分隔。

最后一行输入 N 个正整数。其中第 j 个数表示:编号为 j 的球员投给了哪位球员。


输出格式

第一行输出一个正整数 M,表示将全部球员划分后得到的组数。

接下来 M 行,第 i 行输出第 i 个组的成员:

  • 行首先输出该组球员数量;
  • 然后输出该组所有球员编号。

行内各整数之间用一个空格分隔。

组的输出顺序无关紧要;同一组内球员编号的输出顺序也无关紧要。

如果存在多个解,可以输出任意一个。


限制

  • 1 ≤ N ≤ 100000
  • 1 ≤ 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 个分组。