解析:
用a数组的最大的x个对应b数组最小的x个,其余按照顺序对应即可
如果存在错误则无法成功
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=2e5+5;
int n,x,b[N],res[N];
struct node{
int id,v;
bool operator<(const node& tt)const{
return v<tt.v;
}
}a[N];
void solve(){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].v);
a[i].id=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
sort(a+1,a+n+1);
sort(b+1,b+n+1);
int f=1,p=1;
for(int i=n-x+1;i<=n;i++){
if(a[i].v<=b[p]){
f=0;
break;
}
res[a[i].id]=b[p];
p++;
}
for(int i=1;i<=n-x;i++){
if(a[i].v>b[p]){
f=0;
break;
}
res[a[i].id]=b[p];
p++;
}
if(f){
puts("YES");
for(int i=1;i<=n;i++) printf("%d ",res[i]);
printf("\n\n");
}
else puts("NO\n");
}
signed main(){
int t=1;
scanf("%d",&t);
while(t--) solve();
return 0;
}