题目大意:
给一组数,数量为n,每个数有颜色 ‘B’ / ‘R’ , 若是’B’ 则可以对它的值减一,若是‘R’则可以对它的值加一,问是否可以构造出一组数里包含 1 到 n ;
思路:
用蓝色的数字去构造前面的数,红色构造后面的数
比如 蓝色有k个数 则用蓝色构造 1 到 k ,红色构造k + 1 到 n
因为 蓝色都是减值 故 如果它不在这个构造范围内通过减可以进入这个范围 ,红色同理;
这样我们把蓝色和红色分开存储排序,蓝色从小到大,红色从大到小
然后考虑蓝色组 第 i 个数要大于等于i 否则无法构造;
红色组 第i个数要小于等于 n 否则无法构造。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int a[maxn];
int r[maxn];
int b[maxn];
char rb[maxn];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int rn = 0, bn = 0;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> rb[i];
for(int i = 0; i < n; i++)
{
if(rb[i] == 'B')
{
b[bn] = a[i];
bn++;
}
if(rb[i] == 'R')
{
r[rn] = a[i];
rn++;
}
}
sort(r, r+rn);
sort(b, b+bn);
int flag = 1;
for(int i = 0; i < bn; i++)
{
if(b[i] < i + 1)
{
flag = 0;
cout<<"NO\n";
break;
}
}
if(flag)
{
for(int i = 0; i < rn; i++)
{
if(r[i] > i + bn + 1)
{
flag = 0;
cout<<"NO\n";
break;
}
}
if(flag)
cout<<"YES"<<endl;
}
}
return 0;
}