思路:线段树+二分查找

对于加操作,直接在线段树上修改即可。

对于查询操作,需要在区间[L,R]中查找第K小的数,可以使用二分查找。

具体做法是,对于线段树上的每个节点,维护一个有序数组,表示该节点覆盖的区间中的所有数的排名。排名的计算可以通过前缀和来实现。

对于查询操作,在区间[L,R]上进行二分查找。假设当前二分到的数为mid,那么对于线段树上的每个节点,可以通过该节点覆盖的区间中的排名信息来判断[L,R]中有多少个数小于mid。具体做法是,对于线段树上的每个节点,统计该节点覆盖的区间中有多少个数小于等于mid,如果该数量小于K,则说明mid太小,需要在右子树继续查找;如果该数量大于等于K,则说明mid可能是答案,需要在左子树继续查找。最后,如果找到了第K小的数,就返回mid;否则,返回-1。

时间复杂度

修改操作的时间复杂度为O(logn),查询操作的时间复杂度为O(log^2n),总时间复杂度为O(nlog^2n)。

C++ 代码

请用C++ 实现以下功能: 输入格式: 第一行一个整数N表示序列中元素的个数。 第二行N个整数表示序列中的元素。 第三行一个整数Q表示操作的个数。 接下来Q行每行描述一个操作。操作分为两种: 1 P V表示将第P个数加上V。 2 L R K表示查询区间LR中第K小的数。 输出格式: 对于每个查询操作输出一行表示查询结果。 如果查询结果不存在则输出-1。 输入样例: 5 1

原文地址: https://www.cveoy.top/t/topic/bxKa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录