题目内容
给定一个长度为 n n n 的数组 a a a ,现在需要你从中选择 k k k个数,使得选择的 k k k 个数构成的 k × ( k − 1 ) 2 \frac{k\times (k-1)}{2} 2k×(k−1) 个数对的差的绝对值之和最小,请你输出选择的 k k k 个数,如果有多种答案,输出任意一种即可。
数据范围
- 3 ≤ n ≤ 3 ⋅ 1 0 5 3\leq n\leq 3\cdot 10^5 3≤n≤3⋅105
- − 1 0 8 ≤ a i ≤ 1 0 8 -10^8\leq a_i\leq 10^8 −108≤ai≤108
- 2 ≤ k ≤ n − 1 2\leq k\leq n-1 2≤k≤n−1
题解
这里我们先将 a a a 数组进行排序,后续所说的数组 a a a 也都是从小到大排序的。
有一个很直观的想法,即我们选择的 k k k 个数,在 a a a 数组中,一定是连续的 k k k 个数。
那么问题就转换为求所有窗口大小为 k k k 的数对的差值的绝对值之和,找出这个值最小的窗口。
我们称窗口大小为 k k k 的数对的差值的绝对值之和为窗口权值。
假设当前窗口为 a l a_l al 到 a r a_r ar ,窗口权值为 s u m sum sum
增加一个新的数 a r + 1 a_{r+1} ar+1 ,添加的窗口权值为:
∑ i = l r a r + 1 − a i = ( r − l + 1 ) × a r + 1 − ∑ i = l r a i \sum\limits_{i=l}^r a_{r+1}-a_i=(r-l+1)\times a_{r+1}-\sum\limits_{i=l}^r a_i i=l∑rar+1−ai=(r−l+1)×ar+1−i=l∑rai
删除一个窗口中的数 a l a_l