Description
集合 S 的幂集是 S 的所有子集(包括空集和 S 本身)组成的集合。从一个集合得到它的幂集很容易,但在本题中,我们要反过来操作!
我们从一个(元素不一定唯一的)整数集合 S 出发,求出它的幂集,然后将幂集中的每个元素替换为该子集元素之和,得到一个新集合 S′。例如,如果 S={−1,1},那么 S 的幂集为 {{},{−1},{1},{−1,1}},所以 S′={0,−1,1,0}。S′ 允许包含重复元素,因此如果 S 有 N 个元素,则 S′ 一定有 2N 个元素。
给定 S′ 中各元素及其出现次数的信息,你能还原出原始集合 S 吗?保证 S 存在。如果有多个可能的集合 S 能生成相同的 S′,则保证原始集合 S 是这些可能集合中“最早”的那个。判断集合 S1 是否比集合 S2 更早的方法如下:将每个集合按非递减顺序排序,比较第一个不同的位置,若 S1 在该位置的元素小于 S2,则 S1 更早。
输入的第一行包含测试用例数 T。接下来有 T 组测试数据。每组测试数据包括一行整数 P,接着两行,每行有 P 个用空格分隔的整数。第一行为所有出现在 S′ 中的不同元素 $\mathrm{E}_1, \mathrm{E}_2, \ldots, \mathrm{E}_{\mathrm{P}}$,按升序排列。第二行为这些元素在 S′ 中出现的次数 $\mathrm{F}_1, \mathrm{F}_2, \ldots, \mathrm{F}_{\mathrm{P}}$。也就是说,对于任意 i,元素 Ei 在 S′ 中出现 Fi 次。
对于每组测试数据,输出一行,格式为 "Case #x: ",其中 x 为测试用例编号(从 1 开始),后接原始集合 S 的所有元素,按非递减顺序,用空格分隔。(你需要直接输出 S 的元素,不需要像 S′ 那样输出元素和出现次数两行。)
5
8
0 1 2 3 4 5 6 7
1 1 1 1 1 1 1 1
4
0 1 2 3
1 3 3 1
4
0 1 3 4
4 4 4 4
3
-1 0 1
1 2 1
5
-2 -1 0 1 2
1 2 2 2 1
Case #1: 1 2 4
Case #2: 1 1 1
Case #3: 0 0 1 3
Case #4: -1 1
Case #5: -2 1 1
Hint
样例解释
注意,第 4、5 组样例不在 Small 数据范围内。
第 4 组样例中,S={−1,1} 是唯一满足条件的集合。(它的子集为 {},{−1},{1},{−1,1},这些子集的和分别为 0,−1,1,0,所以 S′ 包含 −1 一次,0 两次,1 一次,正好与输入相符。)
对于第 5 组样例,S={−1,−1,2} 也能生成相同的 S′={−2,−1,−1,0,0,1,1,2},但 S={−2,1,1} 比 {−1,−1,2} 更早,因为在第一个不同的位置,−2<−1。因此 −1 −1 2 不是可接受答案。1 −2 1 也不被接受,虽然它是正确集合,但元素未按非递减顺序输出。
数据范围
- 1≤T≤100。
- 1≤P≤10000。
- Fi≥1。
Small 数据集
- 时间限制:5 秒。
- S 的元素个数在 1 到 20 之间。
- 0≤ 每个 Ei≤108。
Large 数据集
- 时间限制:10 秒。
- S 的元素个数在 1 到 60 之间。
- −1010≤ 每个 Ei≤1010。
由 ChatGPT 4.1 翻译