题意:这个题其实是题意很麻烦,这个题目上有很长的等式,这个等式我们仔细观察我们可以发现,这其实是由3部分组成的,每一部分是关于N,L,和D的,我们可以拆成三个等式看,代表的意思就是,每次加入的新区间的长度,都小于之前区间的长度,但是题目中指出,我们的第一个数是唯一的,所以我们可以的到一个-1,0,1的区间(0是代表第一个数不选的意思,所以就得到了0)这样我们每次扩展的都比之前所拥有的的区间长度小, 所以我们只用记录最小值和最大值就可以了
代码;
#includeusing namespace std;const int maxn=3005;int a[maxn];char ch[maxn];int main(){ int T; scanf("%d",&T); while(T--){ int n,k; scanf("%d%d",&n,&k); int l=-1,r=1; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)cin>>ch[i]; for(int i=2;i<=n;i++){ if(ch[i]=='N'){ l-=a[i];r+=a[i]; } else if(ch[i]=='L'){ r+=a[i]; } else{ l-=a[i]; } } if(l<=k&&k<=r){ puts("yes"); } else{ puts("no"); } } return 0;}