⼆分 c[i]=mid>b[i]
Check ⼀下 c 剩下的和 b 剩下的,能不能达到 f(c,b)-1
⼆分 c[i]=mid<=b[i]
Check ⼀下 c 剩下的和 b 剩下的,能不能达到 f(c,b)
考虑( b[i+1…n] 和剩下的 n-i+1个 a) 的最⼤的 f 值为 p
排序后,肯定是 a 的最⼤的 p 个匹配 b 最⼩的 p 个
考虑我们要选的 a 在不在这个 p 个⾥,如果在且是第 k ⼤的话
那么 a 的第 k+1…p+1 要匹配 b 对应的那⼏个
#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define IL inline
using namespace std;
typedef long long LL;
typedef unsigned int U;
typedef unsigned long long LLU;
typedef pair<int,int> PII;
typedef long double LD;
IL LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
#define io read()
const int N=8008;
int n;
int a[N],b[N],c[N];
int ans[N];
int tmp;
IL bool ok(int num)
{
for(int i=1;i<=num;++i)
{
if(b[i]>=a[n-num+i])
return 0;
}
return 1;
}
IL void get_tmp()
{
int l=0,r=n,mid;
tmp=0;
while(l<=r)
{
mid=(l+r)>>1;
if(ok(mid))
{
tmp=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
}
bool visa[N],visb[N];
int qa[N],qb[N],ta,tb;
IL void work()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(b[j]==c[i]&&!visb[j])
{
visb[j]=1;
break;
}
}
ta=tb=0;
for(int j=1;j<=n;++j){
if(visa[j])
continue;
qa[++ta]=j;
}
for(int j=1;j<=n;++j)
{
if(visb[j])
continue;
qb[++tb]=j;
}
int p;
if(tmp>0)
{
p=ta-tmp+1;
while(p<ta&&a[qa[p]]>b[qb[p-ta+tmp]])
{
++p;
}
if(a[qa[p]]>c[i])
{
ans[i]=a[qa[p]];
visa[qa[p]]=1;
--tmp;
continue;
}
}
p=ta-tmp;
while(p<ta&&a[qa[p]]>b[qb[p-ta+tmp+1]])
{
++p;
}
ans[i]=a[qa[p]];
visa[qa[p]]=1;
}
for(int i=1;i<=n;++i)
{
printf("%d ",ans[i]);
}
}
int main()
{
n=io;
for(int i=1;i<=n;++i)
{
b[i]=io;
c[i]=b[i];
}
for(int i=1;i<=n;++i)
{
a[i]=io;
}
sort(a+1,a+n+1);
sort(b+1,b+n+1);
get_tmp();
work();
return 0;
}