Source
BJOI2018练习赛Day1
Problem
T1 面试
题意
给定长为 N N 序列 和 M,K M , K 。
求最小的 p p 满足 中存在至少 M M 个数,使得其中任意两个数的差小于等于 。
如果不存在输出impossible
。
数据范围
1≤M≤N≤105;0≤k≤105;1≤Ai≤105 1 ≤ M ≤ N ≤ 10 5 ; 0 ≤ k ≤ 10 5 ; 1 ≤ A i ≤ 10 5 。
题解
70分解法
枚举区间最大值 O(n) O ( n ) ,寻找区间长度最小值 O(n) O ( n ) , 复杂度 O(N2) O ( N 2 ) 。
100分解法
对原序列 Ai A i 排序,同时记录 id i d ,即其在原序列中的位置。
二分答案 x x ,每次检查时循环整个序列,将 的数push进一个单调队列,使得插入后队列中元素单调不递减,且队尾队首之差小于等于 K K 。
每次插入后检查队列的长度是否等于 。
至于优先队列,实则不用实际开一个std::deque
。只需要记录一下队列的head
和num
即可。
复杂度 O(n×logn+n×logn)=O(n×logn) O ( n × log n + n × log n ) = O ( n × log n ) 。