【每日一题】补档 CF371E. Subway Innovation | 滑动窗口 | 中等(中等给的是证明)

题目内容

原题链接

给定一个长度为 n n n 的数组 a a a ,现在需要你从中选择 k k k个数,使得选择的 k k k 个数构成的 k × ( k − 1 ) 2 \frac{k\times (k-1)}{2} 2k×(k1) 个数对的差的绝对值之和最小,请你输出选择的 k k k 个数,如果有多种答案,输出任意一种即可。

数据范围

  • 3 ≤ n ≤ 3 ⋅ 1 0 5 3\leq n\leq 3\cdot 10^5 3n3105
  • − 1 0 8 ≤ a i ≤ 1 0 8 -10^8\leq a_i\leq 10^8 108ai108
  • 2 ≤ k ≤ n − 1 2\leq k\leq n-1 2kn1

题解

这里我们先将 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=lrar+1ai=(rl+1)×ar+1i=lrai

删除一个窗口中的数 a l a_l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值