主要就ans2[]要思考:
当前枚举到a[]中的某一个位置 i 时,
1.由于a是非递减的,我们很容易就可以算出>=a[i]的数有多少个 记为co1,
(必须要a[i]之后的,比如 5 7 7 7 ,枚举到 i=3 时,co1应该是 2)
2.然后我们要算出 b[] 中有多少个数 >=a[i], 记为co2
如果co1==co2
那key就要变,变成比上一个小的
规律根据下面几个案例找出:
case1:
a序列: 5 7 7
b序列:5 7 8
case2:
a序列: 10 20 30 40
b序列: 22 33 33 55
case3:
a序列: 5 7 9
b序列:6 9 10
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int ans2[N];
int ans1[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
set<int> sb;
for(int i=1;i<=n;i++)
{
cin>>b[i];
sb.insert(b[i]);
}
for(int i=1;i<=n;i++)
{
auto it=sb.lower_bound(a[i]);
if(it!=sb.end())
{
ans1[i]=*it-a[i];
cout<<ans1[i]<<" ";
}
}
cout<<endl;
int key=b[n];
int co1=1;
for(int i=n;i>=1;i--)
{
ans2[i]=key-a[i];
auto it=sb.lower_bound(a[i]);
if(it!=sb.begin())
{
it--;
}
int idx=lower_bound(b+1,b+1+n,a[i])-b;
int co2=n-idx+1;
if(co1==co2)
{
key=*it;
}
co1++;
}
for(int i=1;i<=n;i++)
cout<<ans2[i]<<" ";
cout<<endl;
}
return 0;
}