#4335. 序列合并——CSP 2024 提高级第一轮

序列合并——CSP 2024 提高级第一轮

有两个长度为 NN 的非负整数序列 AABB,所有数均为非负整数,且小于 10910^9。它们都是单调不降排列。在 A 和 B 中各取一个数相加可以得到N2N_2个和,求其中第 K 小的和。 数据范围满足:1N1051 \leq N \leq 10^51KN21 \leq K \leq N^2

#include <iostream>
using namespace std;

const int maxn = 100005;

int n;
long long k;
int a[maxn], b[maxn];

int* upper_bound(int *a, int *an, int ai) {
    int l = 0, r = ___①___;
    while (l < r) {
        int mid = (l+r)>>1;
        if (___②___) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return ___③___;
}

long long get_rank(int sum) {
    long long rank = 0;
    for (int i = 0; i < n; ++i) {
        rank += upper_bound(b, b+n, sum - a[i]) - b;
    }
    return rank;
}

int solve() {
    int l = 0, r = ___④___;
    while (l < r) {
        int mid = ((long long)l+r)>>1;
        if (___⑤___) {
            l = mid + 1;
        } else {
            r = mid;
        }
    }
    return l;
}

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < n; ++i) cin >> b[i];
    cout << solve() << endl;
}

① 处应填( )

{{ select(1) }}

  • A. an - a
  • B. an - a - 1
  • C. ai
  • D. ai + 1

② 处应填( )

{{ select(2) }}

  • a[mid] > ai
  • a[mid] >= ai
  • a[mid] < ai
  • a[mid] <= ai

③ 处应填( )

{{ select(3) }}

  • a + l
  • a + l + 1
  • a + l - 1
  • an - l

④ 处应填( )

{{ select(4) }}

  • a[n - 1] + b[n - 1]
  • a[n] + b[n]
  • 2 * maxn
  • maxn

⑤ 处应填( )

{{ select(5) }}

  • get_rank(mid) < k
  • get_rank(mid) <= k
  • get_rank(mid) > k
  • get_rank(mid) >= k