题意: 给定n个数Ai, 每个数都带有一个type, (L, R, N) ,
给定一个k, 求Ai是否存在一个子集满足 SUM( Ai*si) = k ,
Ai的ty等于L => si = -1
Ai的ty等于D => si = 1
Ai的ty等于N => si = -1或者1
题目很长的那个式子保证了给定数可以形成一个连续的区间 (现场没有看出这个点....)
解: 然后就暴力求解,可形成的区间最大范围[L, R], 若k属于[L, R]则输出'yes', 否则输出'no'
/*
题目中的很长的式子保证了区间连续性,
即给定的数能构成一个连续的区间.....
故只需要维持这个数列能形成的最大区间范围【L, R】
k在这个区间内即为yes
*/
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i=(a); i<=(b); ++i)
#define ll long long
using namespace std;
const int maxn = 1007;
struct node{
int v;
char ty;
}p[maxn];
int main(){
int t, n, k;
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &k);
rep(i, 1, n) scanf("%d", &p[i].v);
rep(i, 1, n) scanf("%*c%c", &p[i].ty);
int l=-1, r=1;
int sum = 1;
rep(i, 1, n){
if(p[i].ty == 'N'){ //可以正可负
r += p[i].v;
l -= p[i].v;
} else if(p[i].ty =='D'){//只能负
l -= p[i].v;
} else{//只能正
r+=p[i].v;
}
}
if(k<=r && k>=l) cout <<"yes\n";
else cout <<"no\n";
}
return 0;
}