题目描述 数轴上有n个位置a1, a2, …, an,分别代表区间[1, a1], [a1+1, a1+a2], [a1+a2+1, a1+a2+a3], …, [a1+a2+…+an-1+1, a1+a2+…+an]。现在有Q次询问,每次询问某个数字x在哪一段区间内。 输入 第一行有两个数n, Q(1≤n, q≤100,000),表示有n个位置,Q次询问。 第二行n个整数,ai(1≤ai≤10,000, a1+a2+…+an≤10^9)。 第三行Q个整数,表示每次询问的数xi(1≤xi≤a1+a2+…+an)。 输出 Q行,每行一个数,表示每次询问的结果。 样例输入 Copy 5 3 2 7 3 4 9 1 25 11 样例输出 Copy 1 5 3
时间: 2023-10-24 09:34:11 浏览: 756
以下是一个可能的C++实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
// 计算每个区间的左右端点
vector<int> left(n), right(n);
int cur = 1;
for (int i = 0; i < n; i++) {
left[i] = cur;
cur += right[i] = a[i];
}
// 依次回答每个询问
for (int i = 0; i < q; i++) {
int x;
cin >> x;
// 二分查找x所在的区间
int l = 0, r = n - 1;
while (l < r) {
int mid = (l + r) / 2;
if (x < left[mid]) {
r = mid - 1;
} else if (x > right[mid]) {
l = mid + 1;
} else {
l = r = mid;
}
}
// 输出区间编号
cout << (l + 1) << endl;
}
return 0;
}
```
该实现首先计算出每个区间的左右端点,然后对于每个询问,使用二分查找找到x所在的区间,并输出该区间的编号。
阅读全文