链接:CF
把 1 1 1 ~ k k k 分为 4 4 4 类:两个里面都有的(1)、只在a里面的(2)、只在b里面的(3)、a和b里都没有的(4)
如果有(4),就肯定不行
如果(3)或者(2)中某一个的数量超过 k k k 的一半,也不行
否则就行
代码:
#include<bits/stdc++.h>
#define K 440000
#define M 220000
#define N 220000
#define int long long
using namespace std;
int a[N]={},b[M]={},k=0,m=0,n=0,t=0;
int hs[K]={},wh[K]={};
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%lld",&b[i]);
}
for(int i=1;i<=k;i++){
hs[i]=0;
wh[i]=-1;
}
for(int i=1;i<=n;i++){
if(a[i]<=k&&wh[a[i]]!=1){
hs[a[i]]++;
wh[a[i]]=1;
}
}
for(int i=1;i<=m;i++){
if(b[i]<=k&&wh[b[i]]!=2){
hs[b[i]]++;
wh[b[i]]=2;
}
}
int s1=0,s2=0;
bool flag=false;
for(int i=1;i<=k;i++){
if(hs[i]==0){
flag=true;
break;
}
if(hs[i]==1){
if(wh[i]==1){
s1++;
}else{
s2++;
}
}
}
if(s1>k/2||s2>k/2){
flag=true;
}
if(flag==true){
printf("NO\n");
}else{
printf("YES\n");
}
}
return 0;
}