#CF2107C. 最大子段和

最大子段和

每次测试时间限制:2 秒
每次测试内存限制:256 兆字节


题目描述

你有一个长度为 nn 的数组 a1,a2,,ana_1, a_2, \dots, a_n 和一个正整数 kk,但数组 aa 的某些部分是缺失的。你的任务是填充缺失的部分,使得数组 aa最大子段和恰好等于 kk,或者报告不存在解。

形式化地,你得到一个二进制字符串 ss 和一个部分填充的数组 aa,其中:

  • 如果你记得 aia_i 的值,则 si=1s_i = 1,并且给出了 aia_i 的真实值。
  • 如果你不记得 aia_i 的值,则 si=0s_i = 0,并且给出的 ai=0a_i = 0

所有你记得的值满足 ai106|a_i| \leq 10^6。然而,你可以使用绝对值不超过 101810^{18} 的值来填充你不记得的位置。可以证明,如果解存在,那么也存在一个满足 ai1018|a_i| \leq 10^{18} 的解。


最大子段和:数组 aa 的长度为 nn,即 a1,a2,,ana_1, a_2, \dots, a_n 的最大子段和定义为:

max1ijnS(i,j)\max_{1 \leq i \leq j \leq n} S(i, j)

其中:

S(i,j)=ai+ai+1++ajS(i, j) = a_i + a_{i+1} + \dots + a_j

输入格式

每个测试包含多个测试用例。
第一行包含一个整数 tt1t1041 \leq t \leq 10^4),表示测试用例的数量。
接下来每个测试用例的格式如下:

  • 第一行包含两个整数 n,kn, k1n21051 \leq n \leq 2 \cdot 10^51k10121 \leq k \leq 10^{12})。
  • 第二行包含一个长度为 nn 的二进制字符串 ss
  • 第三行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_nai106|a_i| \leq 10^6)。
    如果 si=0s_i = 0,则保证 ai=0a_i = 0

数据保证所有测试用例的 nn 之和不超过 21052 \cdot 10^5


输出格式

对于每个测试用例:

  • 第一行输出 Yes 如果存在解,否则输出 No。大小写不敏感,例如 YESyEs 也可接受。
  • 如果存在至少一个解,则在第二行输出 nn 个数 a1,a2,,ana_1, a_2, \dots, a_n
    必须满足 ai1018|a_i| \leq 10^{18}

示例

输入

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
只有第一个位置未填充。我们可以用 44 填充它,得到数组 [4,0,1][4, 0, 1],其最大子段和为 55

测试用例 2
只有第三个位置未填充。我们可以用 55 填充它,得到数组 [4,3,5,2,1][4, -3, 5, -2, 1]。最大子段和来自子数组 [4,3,5][4, -3, 5],和为 66,符合要求。

测试用例 3
第一个和第二个位置未填充。我们可以用 22 填充两个位置,得到数组 [2,2,4,5][2, 2, -4, -5],最大子段和为 44。注意其他解也是可能的,例如 [0,4,4,5][0, 4, -4, -5]

测试用例 4
无法得到有效数组。例如,如果用 00 填充第三个位置,得到 [1,2,0,5,1,9][1, 2, 0, 5, -1, 9],最大子段和为 1616,不是要求的 1212