Algorithm Notes

LJXin

记录算法刷题、竞赛思路与编程成长,希望每一篇都讲清楚一点、写扎实一点。

# 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略
    }
}

AI使用说明:仅使用AI进行排版

posted @ 2026-04-16 12:56  kliu_365  阅读(17)  评论(0)    收藏  举报
TOP