#jag2017summerday3j. [jag2017summer_day3_j]Sum Source Detection
[jag2017summer_day3_j]Sum Source Detection
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }}); blockquote { font-family: Menlo, Monaco, "Courier New", monospace; color: #333333; display: block; padding: 8.5px; margin: 0 0 9px; font-size: 16px; line-height: 18px; background-color: #f5f5f5; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; }
### 问题描述
JAG成员开始了一个整数游戏。游戏由$N + M + 1$个玩家组成:$N$个公开数字持有者,$M$个秘密数字持有者和一个回答者——你。
在准备阶段,一个整数$K$被告知给所有$N+M+1$个玩家。根据以下限制,$N+M$个数字持有者选择他们自己的整数:
* 每个持有者拥有一个正整数。
* 所有整数的和等于$K$。
* 秘密数字持有者拥有的每个整数都严格小于公开数字持有者拥有的任何整数。
在选择之后,$N$个公开数字持有者向回答者展示他们的整数$O_1, \dots, O_N$,而秘密数字持有者不展示。
游戏有$Q$轮。在每一轮开始时,$M$个秘密数字持有者可以根据上述限制更改他们的数字,而公开数字持有者不能。然后,$N+M$个数字持有者从中任意选择一部分成员,计算所选成员拥有的整数的和$X$,并告诉回答者$X$。对于每一轮,回答者试图根据信息$K$、$X$和$O_1, \dots, O_N$来确定绝对被选中的公开数字持有者:回答者将获得每一轮中实际被选中的公开数字持有者的分数。另一方面,如果答案中至少含有一个未被选中的成员,你将丢失本轮中获得的分数。因此,回答者即你,必须只回答那些绝对被选中的公开数字持有者。
在这个问题中,你的任务是编写一个程序,以最大化你的分数,确定每一轮中求和所必需的所有公开数字持有者。
* * *
### 输入
输入由一个单独的测试用例组成,格式如下。
> $N$ $M$ $K$ $Q$ $O_1$ $\\cdots$ $O_N$ $X_1$ $\\cdots$ $X_Q$
第一行由四个整数$N$、$M$、$K$和$Q$组成。$N$和$M$分别是公开数字持有者和秘密数字持有者的数量$(1 \\le N, 0 \\le M, N + M \\le 40)$。$K$是一个整数$(1 \\le K \\le 200{,}000)$。$Q$是游戏的轮数$(1 \\le Q \\le 10{,}000)$。
第二行包含$N$个整数$O_1, \\cdots, O_N$,表示第$i$个公开数字持有者拥有$O_i$($1 \\le O_1 \\le \\dots \\le O_N \\le K$)。
第三行表示$Q$个整数$X_1, \\cdots, X_Q$($0 \\le X_i \\le K$)。$X_i$是第$i$轮中所选成员拥有的整数的和。
保证存在至少一种方式来组成$X_i$。换句话说,你可以假设存在至少一个整数序列$S_1, \\dots, S_M$,表示秘密数字持有者拥有的整数,满足以下条件:
* $1 \\lt S_j \\lt O_1$对于$1 \\le j \\le M$。注意,$O_1 = \\min_{1 \\le k \\le N} O_k$成立。
* $\\sum_{j=1}^{N} O_j + \\sum_{k=1}^{M} S_k = K$。
* 存在至少一对子集$U \\subseteq \\{1, \\dots, N\\}$和$V \\subseteq \\{1, \\dots, M\\}$,使得$\\sum_{j \\in U} O_j + \\sum_{k \\in V} S_k = X_i$成立。
### 输出
对于每个和$X_i$,以升序打印需要拼凑$X_i$的公开数字持有者的索引。每个和的输出必须打印在一行中,以单个空格分隔。如果没有一个公开数字持有者的整数被用于$X_i$,请在一行中打印$-1$。
* * *
### 示例输入1
```plain
2 2 23 2
7 10
9 10
示例输出1
1
-1
第一个和只能通过第一个公开数字持有者的加上一个秘密数字持有者的来达到。在这种情况下,秘密数字持有者拥有和。第二个和可能是第二个公开数字持有者的。第一个公开持有者的加上也是可能的,因为秘密数字持有者有两个。
示例输入2
1 1 100 3
51
49 51 100
示例输出2
-1
1
1
唯一的秘密数字持有者拥有。第一个和的输出是,因为没有选中公开数字持有者的。
示例输入3
2 1 58152 4
575 57500
575 57577 77 0
示例输出3
1
2
-1
-1
在这种情况下,唯一的秘密数字持有者肯定有。最后一个和的输出是,因为没有任何一个公开数字持有者的整数需要形成。
示例输入4
3 2 1500 1
99 300 1000
99
示例输出4
1
组成的唯一方法是只选择第一个公开数字持有者;秘密数字持有者之间有两个介于和之间的整数,而它们的和必须为。
示例输入5
3 2 20 19
3 3 11
1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20
示例输出5
-1
-1
-1
-1
-1
-1
1 2
1 2
1 2
3
3
3
3
3
3
3
1 2 3
1 2 3
1 2 3
两个秘密数字持有者拥有和。至少需要一个公开数字持有者的来组成分别为和的和,但无法确定绝对选中的公开数字持有者。另一方面,需要拥有的两个公开数字持有者。