📜  门|门 CS 1997 |第 46 题(1)

📅  最后修改于: 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 格式返回。