时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

三年之期已到,恭迎龍王!!!

龍王自爆身份,开始无尽的复仇,但是长时间的赘婿生活使得他已经忘记了保险箱的密码。

他需要这笔资金来召集手下,于是他找到了你。

你会根据破译密码的难度来收费;

保险柜上会显示一串只包含01的数组

你可以进行两种操作:

1.选中数组的一个连续子数组(可以选择整个数组),将其区间翻转(    ),这个操作会收取 a 枚金币。

2.选中数组的一个连续子数组(可以选择整个数组或者一个单独的数字),将子数组里面取反,1 全部变成 0 , 0 全变成 1 ,(  ).这个操作会收取 b 枚金币。

当数组里的 0 全变成 1 的时候,保险箱就会打开。
为了尽可能的帮助龍王,你需要使用收取金币最少的方式。

龍王打工四年的积蓄有 x 枚金币,你需要知道龍王是否有能力向你支付开保险箱的报酬,如果能够支付,请打印两行,第一行打印 “ Yes ”,第二行打印龍王剩下的金币。如果不能够,请输出“ No ”。


输入描述:

第一行输入一个  t , ,代表有 t 组数据

每组数据的第一行有 4 个数字 ,,
第二行输入长度为 n 的数组

保证所有数组的长度和小于等于

输出描述:

如果能够支付,请打印两行,第一行打印“ Yes ”,第二行打印龍王剩下的金币。

如果不能够,请输出“ No ”。
示例1

输入

复制
3
5 1 10 20
01000
5 1 10 10
01000
5 99 99 1
11111

输出

复制
Yes
9
No
Yes
1