本题考查前缀上的第 k 小,可以用排序 / 有序序列维护。
把查询按下标从 0 开始编号。第 j+1 次查询给出前缀长度 B[j],要求在 A[0..B[j]−1] 中取第 j+1 小的价格。
关键观察:查询序号本身就是名次。不是问「第 B[j] 件货物」,也不是问「第 B[j] 小」,而是「当前前缀里第 j 小(从 1 计)」。题目保证 j≤B[j],因此这个名次一定落在前缀内部。
B 不一定单调,但可以把查询按 B[j] 从小到大离线处理:前缀只增不减。把新进入仓库的货物插入当前有序序列,再直接读取 arr[j]。
有一批货物 A 会按顺序进入仓库,第 i 件货物的价格是 A[i]。
管理员会发起一组查询请求 B,对于第 j 次查询,你需要回答:在当前已经进入仓库的前 B[j] 件货物中,按价格从小到大排序后,第 j 位的价格是多少。
题目保证所有查询合法,也就是说在第 j 次查询时,当前货物数量不少于 j。
其中 1≤j≤B[j]≤5000,1≤A[i]≤1000000。
一个数组,其中每个元素为查询列表 B 中,每次指令查询的价格结果。
输入
7,4,[9,7,2,8,14,1,8],[1,2,6,6]
输出
[9,9,7,8]
说明
7 件货物依次进入仓库;价格依次为:9, 7, 2, 8, 14, 1, 84 次查询,查询发生的时间分别是:
1、前 2、前 6、前 6 件货物进入后1 次查询(B[j]=1):
1 件货物 = [9],排序后 [9]。1 次查找第 1 位,答案:9。2 次查询(B[j]=2):
2 件货物 = [9, 7],排序后得到:[7, 9]。2 次查询要找第 2 位,答案:9。3 次查询(B[j]=6):
6 件货物 = [9, 7, 2, 8, 14, 1],排序后得到:[1, 2, 7, 8, 9, 14]。3 次查询要找第 3 位,答案:7。4 次查询(B[j]=6):
6 件货物 = [9, 7, 2, 8, 14, 1],排序后得到:[1, 2, 7, 8, 9, 14]。4 次查询要找第 4 位,答案:8。输入
5,5,[8,4,4,10,9],[1,2,3,5,5]
输出
[8,8,8,9,10]
说明
5 件货物,价格依次为:8, 4, 4, 10, 95 次查询,发生时机分别是:
1、前 2、前 3、前 5、前 5 件货物进入之后1 次查询(B[j]=1):
1 件货物 = [8],排序后 [8]。1 位,答案:8。2 次查询(B[j]=2):
2 件货物 = [8, 4],排序后 [4, 8]。2 位,答案:8。3 次查询(B[j]=3):
3 件货物 = [8, 4, 4],排序后 [4, 4, 8]。3 位,答案:8。4 次查询(B[j]=5):
5 件货物全部进入 = [8, 4, 4, 10, 9],排序后 [4, 4, 8, 9, 10]。4 位,答案:9。5 次查询(B[j]=5,与第 4 次查询时机相同):
5 件货物 = [4, 4, 8, 9, 10]。5 位,答案:10。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.