📅  最后修改于: 2023-12-03 14:58:34.981000             🧑  作者: Mango
本题为《门|门》中的第 46 题,是一道纯算法题目,需要程序员使用二分法算法来解决。
给出一个长度为 $n$ 的非降序列 $a$,再给定 $q$ 个询问。每个询问都包含两个整数 $x$ 和 $k$。请回答序列 $a$ 中有多少个元素不大于 $x$。
第一行包含两个整数 $n$ 和 $q$,表示序列 $a$ 的长度和询问次数。
第二行包含 $n$ 个整数,表示序列 $a$。
接下来 $q$ 行,每行包含两个整数 $x$ 和 $k$,表示一个询问。
对于每个询问,在一行中输出序列 $a$ 中不大于 $x$ 的元素个数。
4 3
1 2 4 4
3 2
4 1
1 3
2
4
0
本题需要使用二分法算法来解决。对于每一个询问,我们需要在序列 $a$ 中找到第一个大于 $x$ 的数的位置,然后用序列总长度减去这个位置,即为序列 $a$ 中不大于 $x$ 的元素个数。
实现时,可以使用 Python 内置函数 bisect_left
来查找第一个大于 $x$ 的数的位置,具体可参考下面的代码片段。
import bisect
# 读入序列 a
n, q = map(int, input().split())
a = list(map(int, input().split()))
for i in range(q):
x, k = map(int, input().split())
# 查找第一个大于 x 的数的位置
pos = bisect.bisect_left(a, x + 1)
# 计算不大于 x 的数的个数
print(n - pos)
以上是 Python 3 实现的代码片段,该代码片段已按 markdown 格式返回。