#CF2107C. 最大子段和
最大子段和
每次测试时间限制:2 秒
每次测试内存限制:256 兆字节
题目描述
你有一个长度为 的数组 和一个正整数 ,但数组 的某些部分是缺失的。你的任务是填充缺失的部分,使得数组 的最大子段和恰好等于 ,或者报告不存在解。
形式化地,你得到一个二进制字符串 和一个部分填充的数组 ,其中:
- 如果你记得 的值,则 ,并且给出了 的真实值。
- 如果你不记得 的值,则 ,并且给出的 。
所有你记得的值满足 。然而,你可以使用绝对值不超过 的值来填充你不记得的位置。可以证明,如果解存在,那么也存在一个满足 的解。
最大子段和:数组 的长度为 ,即 的最大子段和定义为:
其中:
输入格式
每个测试包含多个测试用例。
第一行包含一个整数 (),表示测试用例的数量。
接下来每个测试用例的格式如下:
- 第一行包含两个整数 (,)。
- 第二行包含一个长度为 的二进制字符串 。
- 第三行包含 个整数 ()。
如果 ,则保证 。
数据保证所有测试用例的 之和不超过 。
输出格式
对于每个测试用例:
- 第一行输出
Yes如果存在解,否则输出No。大小写不敏感,例如YES、yEs也可接受。 - 如果存在至少一个解,则在第二行输出 个数 。
必须满足 。
示例
输入
10
3 5
011
0 0 1
5 6
11011
4 -3 0 -2 1
4 4
0011
0 0 -4 -5
6 12
110111
1 2 0 5 -1 9
5 19
00000
0 0 0 0 0
5 19
11001
-8 6 0 0 -5
5 10
10101
10 0 10 0 10
1 1
1
0
3 5
111
3 -1 3
4 5
1011
-2 0 1 -5
输出
Yes
4 0 1
Yes
4 -3 5 -2 1
Yes
2 2 -4 -5
No
Yes
5 1 9 2 2
Yes
-8 6 6 7 -5
Yes
10 -20 10 -20 10
No
Yes
3 -1 3
Yes
-2 4 1 -5
样例解释
测试用例 1
只有第一个位置未填充。我们可以用 填充它,得到数组 ,其最大子段和为 。
测试用例 2
只有第三个位置未填充。我们可以用 填充它,得到数组 。最大子段和来自子数组 ,和为 ,符合要求。
测试用例 3
第一个和第二个位置未填充。我们可以用 填充两个位置,得到数组 ,最大子段和为 。注意其他解也是可能的,例如 。
测试用例 4
无法得到有效数组。例如,如果用 填充第三个位置,得到 ,最大子段和为 ,不是要求的 。