📅  最后修改于: 2023-12-03 15:26:03.458000             🧑  作者: Mango
本文将向程序员介绍教资会网络中的 UGC NET CS 2015 年六月 – II 问题2。这个问题测试程序员对数据结构和算法的理解。
有一个长度为 $n$ 的整数序列 $a_1, a_2, \cdots, a_n$,它的最小值是 $m$,最大值是 $M$,执行以下四个操作:
请实现一个程序来执行上述操作。
第一行包含一个整数 $n$。 第二行包含 $n$ 个整数 $a_1, a_2, \cdots, a_n$。 第三行包含一个整数 $m$。 第四行包含一个整数 $M$。 第五行包含一个整数 $q$,表示操作个数。 接下来 $q$ 行,每行一个操作,格式如下:
1 i x
:第 $i$ 个数加上 $x$。2 i x
:第 $i$ 个数减去 $x$。3 y
:查询每个数的值除以 $y$ 的余数有多少个。4 l r p
:查询 $[l, r]$ 范围内有多少个数小于等于 $p$。对于每个操作 $3$,输出每个数的值除以 $y$ 的余数有多少个,每行一个数。 对于每个操作 $4$,输出 $[l, r]$ 范围内有多少个数小于等于 $p$。
输入:
5
3 2 4 1 5
1
5
3 2
4 1 5 4
1 3 5
2 1 2
4 2 4 3
输出:
1
1
2
2
1
操作1和操作2只需要对相应的数进行加减即可,时间复杂度为 $O(1)$。
对于每个数 $a_i$,根据余数 $r=a_i\mod y$,将它归为在第 $r$ 组内,然后用一个桶记录下每组内有多少个数即可。时间复杂度 $O(n)$。
先将整个序列升序排序,然后二分查找区间 $[l,r]$ 中小于 $p$ 的位置 $pos$,并返回 $pos-l+1$。时间复杂度为 $O(n\log n)$。
本题考察了数据结构与算法中的常见问题,包括求余数、桶排序、二分查找。通过解决本题,程序员可以提高对这些问题的认识,并且可以使用这些知识解决类似的问题。