# CF_Div2_1721_C
CF_Div2_1721_C
题目描述
t 个样例,每个样例:给定两个升序数组 a 和 b。
我们对每个 a[i] 加上一个非负数 d[i],得到新数组,再对这个新数组排序,恰好得到 b。
现在对于每个位置 i,求 d[i] 可能的最小值和最大值。
- 不同位置的最优解可以对应不同的 d 数组
- 每个
a[i]加上d[i]后整体排序得到 b,而不是逐个对应
输入输出及数据范围
输入格式:
- 第一行:整数 t (1 ≤ t ≤ 10⁴),样例数
- 每个样例的第一行:整数 n (1 ≤ n ≤ 2×10⁵)
- 下一行:n 个整数 a₁, a₂, ..., aₙ (1 ≤ a₁ ≤ a₂ ≤ ... ≤ aₙ ≤ 10⁹)
- 下一行:n 个整数 b₁, b₂, ..., bₙ (1 ≤ b₁ ≤ b₂ ≤ ... ≤ bₙ ≤ 10⁹)
数据范围:
- 输入数据满足至少有一个满足题意的 d
- 所有的 n 和不超 2×10⁵
输出格式:
每个样例两行:
- 第一行:d₁^min, d₂^min, ..., dₙ^min
- 第二行:d₁^max, d₂^max, ..., dₙ^max
思路剖析
问题分析:
对每个a[i],为了让d[i]最小,直接在b中找一个大于等于ta的元素即可,这里用lower_bound实现
对于最大的d[i],当然也是寻找靠后的b[j],但是有匹配的上限,因为a[i]跳的越远,留给a[i+1]-a[n]匹配的b的元素就越少,而且为了保证每个a[i]都加上一个非负的d得到b,以此,
存在某个位置k,使得a[k+1]>b[k],那么前k个a不可能去匹配b[k+1]-b[n]的任何一个,因为如果a[k]匹配了b[k+1],b[1]-b[k]的中至少一个元素去匹配a[k+1]-a[n],但是a[k+1]>b[k],且a是升序的,所以a[k+1]-a[n]的大于对应的b,那就不存在 ai+d=b[j]j(1<=j<=k)
**解题思路:
对求dmin,直接lowerbound
对求dmax
反方向记录r=k使得a[k+1]>b[k],此时i<=k的a与b[k]匹配得到对应的最大dmax
代码实现
#define ll long long
void solve() {
int t,n;cin>>t;
while(t--){
cin>>n;
vector<int>a(n),b(n),r1(n),r2(n);
for(auto&x:a) cin>>x;
for(auto&x:b)cin>>x;
for(int i=0;i<n;++i){
r1[i]=*lower_bound(b.begin(),b.end(),a[i])-a[i];
}
int r=n-1;
for(int i=n-2;i>=0;--i){
if(a[i+1]>b[i])r=n-1;
r2[i]=b[r]-a[i];
}
输出r1,r2略
}
}

浙公网安备 33010602011771号