#P1333. Christmas Gifts
Christmas Gifts
题目描述
每年圣诞节,父母都会面临一个甜蜜的烦恼:为孩子们准备礼物。由于孩子们会互相比较收到的礼物,父母需要精心安排,确保没有一个孩子会嫉妒其他孩子的礼物。
在购物前,父母会向孩子们宣布一个固定的候选礼物集合,并说明每个孩子将获得这些候选礼物的一个子集。孩子们随后会向父母提出自己的快乐条件,这些条件通常是基于其他兄弟姐妹将获得的礼物来定义的。父母的目标是:在满足所有孩子条件的前提下,为每个孩子分配尽可能小的礼物子集。
每个孩子的条件总是一个逻辑与(conjunction)的形式:
我需要至少(a1 且 a2 且 ... 且 an)
其中,每个 可以是以下四种类型之一:
- [类型1] 一个固定的候选礼物子集(常量集合);
- [类型2] 一个兄弟姐妹的名字(表示该兄弟姐妹的礼物);
- [类型3] 两个 (类型1或2)的共同部分(即两者共有的礼物);
- [类型4] 一个兄弟姐妹的名字,后跟 "except-for" 和一个固定的候选礼物子集(表示该兄弟姐妹的礼物排除某些特定礼物后的结果)。
示例
假设有三个孩子 和三个候选礼物 ,他们的条件如下:
- 的条件:至少 且 和 的共同礼物;
- 的条件:至少 和 的共同礼物;
- 的条件:至少 且 的礼物排除 。
此时,满足条件的最小礼物分配为:
- :
- :
- :
输入
输入包含 个测试用例,第一行为测试用例数量 。
每个测试用例的格式如下:
- 第一行:两个整数 (候选礼物数量,)和 (孩子数量,);
- 后续行:按孩子编号顺序( 到 )描述每个孩子的条件:
- 第一行:孩子的编号 和其条件中的 数量;
- 后续行:每个 的具体描述(每行一个 ),格式如下:
- 类型1:
-1 k g1 g2 ... gk
(表示固定集合); - 类型2:
-2 j
(表示孩子 的礼物); - 类型3:
-3 <ai1> <ai2>
(表示 和 的共同部分, 和 需为类型1或2); - 类型4:
-4 <ai1> <ai2>
(表示 的礼物排除 中的礼物, 为类型2, 为类型1)。
- 类型1:
输入样例
3
2 2
1 1
-1 1 1
2 1
-4 -2 1 -1 1 1
1 1
1 1
-3 -1 1 1 -1 1 1
3 3
1 2
-1 2 1 2
-3 -2 2 -2 3
2 1
-3 -2 3 -1 2 2 3
3 2
-1 1 1
-4 -2 1 -1 1 3
输出
按测试用例顺序输出结果,每个测试用例的输出为 行(按孩子编号升序排列),每行格式为:
孩子编号 [礼物编号1 礼物编号2 ...]
若某孩子没有礼物,则仅输出其编号。
输出样例
1 1
2
1 1
1 1 2
2 2
3 1 2
题目来源
Taejon 2002