题目大意:给一个整数序列和一个字符串,字符串的每位字符对应序列的每位数字,对于整数序列, 字符是B则只能减,字符是R则只能加,问能不能通过上述操作使序列变成1~n的排列
思路:本题贪心思路确实难想,应该是按字符排序,保证先处理完全部的B再处理A,因为用for循环枚举处理1~n的每个数的时候必须减法优先,原因是只有从小到大处理才能包含整个1~n的序列。这道题的贪心表面上是排序数字,从小往大贪心,其实是排序字母,从减法往加法贪心
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5+10;
typedef pair<char, int> PII;
int n;
string s;
PII q[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>q[i].second;
cin>>s;
for(int i=0;i<s.size();i++)
{
q[i+1].first=s[i];
}
sort(q+1,q+n+1);
bool flag=false;
for(int i=1;i<=n;i++)
{
//cout<<i<<" "<<q[i].first<<" "<<q[i].second<<endl;
if(q[i].first=='B'&&q[i].second<i) {puts("NO");return;}
if(q[i].first=='R'&&q[i].second>i) {puts("NO");return;}
}
puts("YES");
}
int main()
{
int _;
cin>>_;
for(int i=0;i<_;i++) solve();
return 0;
}