CF2107C Maximum Subarray Sum
题目描述
给你一个长为 $n$ 的序列 $a=(a_1,a_2,\cdots,a_n)$,$a$ 的一部分丢失了。你的任务是填补丢失的部分使得 $a$ 的最大子区间和为 $k$,或报告无解。
给你一个 01 串 $s$ 和 $a$:
- 如果 $a_i$ 没有被丢失,$s_i=1$,此时 $a_i$ 记录了它的真实值。
- 如果 $a_i$ 被丢失,$s_i=0$,此时给到你的序列 $a$ 中 $a_i=0$。
输入的 $a$ 满足 $\vert a_i\vert\le 10^6$,你填充后的 $a$ 需要满足 $\vert a_i\vert \le 10^{18}$。可以被证明如果存在解,那么一定存在一个满足 $\vert a_i\vert \le 10^{18}$ 的解。
一个长为 $n$ 的数列 $a$ 的最大子区间和是 $\max\limits_{1\le i\le j\le n}\sum\limits_{k=i}^j a_k$。
输入格式
多组数据,第一行一个整数为数据组数 $t(1\le t\le 10^4)$。
对于每组数据,第一行两个整数 $n,k(1\le n\le 2\times 10^5,1\le k\le 10^{12})$。\
第二行为一个长为 $n$ 的 01 字符串 $s$。\
第三行 $n$ 个整数 $a_1,a_2,\cdots,a_n(\vert a_i\vert\le 10^6)$。保证 $s_i=0$ 时 $a_i=0$。
保证一个测试点中 $\sum n\le 2\times 10^5$。
输出格式
对于每组数据,第一行一个字符串,如果有解输出 `Yes`,如果无解输出 `No`。大小写不敏感。
如果有解,第二行输出填充后的字符串 $a$。你需要保证 $\vert a_i\vert\le 10^{18}$。
如果有多种解法,输出任意一种均可。
说明/提示
第一组数据中,向唯一丢失的 $a_1$ 填充 $4$ 得到 $a=(4,0,1)$,它的最大子区间和为 $5$。
第二组数据中,向唯一丢失的 $a_3$ 填充 $5$ 得到 $a=(4,-3,5,-2,1)$,它的最大子区间和为 $6$。
第三组数据中 $a_1$ 和 $a_2$ 待填充,向它们填充 $2$ 得到 $a=(2,2,-4,-5)$,它的最大子区间和为 $4$。$a=(0,4,-4,-5)$ 也是一种解法。
对于第四组数据,没有合法的填充 $a$ 的方式。例如 $a=(1,2,0,5,-1,9)$,它的最大子区间和为 $16$ 而非 $12$。
By chenxi2009