正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2024 第一轮真题 › 第36题
CSP-S 2024 第一轮 第36题:完善程序(第 19 题)第 4 空
题目
(序列合并) 有两个长度为 $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[n-1]+b[n-1]
- B. a[n]+b[n]
- C. 2 * maxn
- D. maxn
答案
A
题解
应选 A:a[n-1] + b[n-1]。
solve() 是在二分查找第 \(K\) 小的和,所以初始区间 [l, r] 必须包含答案。
- 所有元素都非负,因此左边界可以取
l = 0。 - 两个序列都单调不降,最大元素分别为
a[n-1]和b[n-1],所以最大的和是a[n-1] + b[n-1],用它作右边界即可。
注意:长度为 n 的序列,下标是 0 到 n-1;maxn 表示数组容量,不能用来限制元素之和。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号