正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-S 2024 第一轮真题 › 第34题

CSP-S 2024 第一轮 第34题:完善程序(第 19 题)第 2 空

完善程序 · 二分查找与二分答案 · 答案 A

题目

(序列合并) 有两个长度为 $N$ 的单调不降序列 $A$ 和 $B$,序列的每个元素都是小于 $10^9$ 的非负整数。在 $A$ 和 $B$ 中各取一个数相加可以得到 $N^2$ 个和,求其中第 $K$ 小的和。上述参数满足 $N \leq 10^5$ 和 $1 \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;
}

本小题

② 处应填(  )?

选项

  • A. a[mid] > ai
  • B. a[mid] >= ai
  • C. a[mid] < ai
  • D. a[mid] <= ai

答案

A

题解

选 A:a[mid] > ai。

这里的 upper_bound 要找到第一个大于 ai 的元素的位置。因此:

  • 如果 a[mid] > ai,那么 mid 可能就是答案,令 r = mid;
  • 否则,a[mid] <= ai,答案一定在右边,令 l = mid + 1。

为什么要找“大于”而不是“大于等于”?看这句: ``cpp upper_bound(b, b+n, sum - a[i]) - b ` 它统计的是 b 中小于等于 sum - a[i]` 的元素个数,也就是满足 \[ a[i]+b[j]\le sum \] 的配对数量。

例如 b = [1, 2, 2, 4],查询值为 2,第一个大于 2 的数是 4,下标为 3,说明有 3 个元素小于等于 2。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号