时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
三年之期已到,恭迎龍王!!!
龍王自爆身份,开始无尽的复仇,但是长时间的赘婿生活使得他已经忘记了保险箱的密码。
他需要这笔资金来召集手下,于是他找到了你。
你会根据破译密码的难度来收费;
保险柜上会显示一串只包含

和

的数组
你可以进行两种操作:
1.选中数组的一个连续子数组(可以选择整个数组),将其区间翻转(

),这个操作会收取

枚金币。
2.选中数组的一个连续子数组(可以选择整个数组或者一个单独的数字),将子数组里面取反,

全部变成

,

全变成

,(

).这个操作会收取
枚金币。
当数组里的

全变成
的时候,保险箱就会打开。
为了尽可能的帮助龍王,你需要使用收取金币最少的方式。
龍王打工四年的积蓄有

枚金币,你需要知道龍王是否有能力向你支付开保险箱的报酬,如果能够支付,请打印两行,第一行打印 “ Yes ”,第二行打印龍王剩下的金币。如果不能够,请输出“ No ”。
输入描述:
第二行输入长度为

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

输出描述:
如果能够支付,请打印两行,第一行打印“ Yes ”,第二行打印龍王剩下的金币。
如果不能够,请输出“ No ”。
示例1
输入
复制
3
5 1 10 20
01000
5 1 10 10
01000
5 99 99 1
11111