先考虑一个连续单调上升的区间,因为越稀疏差异值越大。它的差异值为
第一部分为x在区间中作为大数的和
第二部分为x在区间中作为小数的和
所以
第一部分用加权前缀和,第二部分用前缀和
//
// Created by yumo_
//
#include<bits/stdc++.h>
using namespace std;
#define scin std::cin
#define scout std::cout
using i64=long long;
const int INF=INT_MAX/2;
const i64 INFF=LLONG_MAX/2;
const int M=1e5+7;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int T;
// scin>>T;
T=1;
for (;T>0;--T) {
int n,k;scin>>n>>k;
std::vector<i64> a(n+5);
for (int i=1;i<=n;++i) {
scin>>a[i];
}
sort(a.begin()+1,a.begin()+n+1);
std::vector<i64> pre(n+5);
std::vector<i64> mpre(n+5);
for (int i=1;i<=n;++i) {
pre[i]=pre[i-1]+a[i];
mpre[i]=mpre[i-1]+a[i]*i;
}
i64 mi=INFF;
for (int l=1;l<=n;++l) {
int r=l+k-1;if (r>n)break;
i64 now=2*(mpre[r]-mpre[l-1]);
now-=(l+r)*(pre[r]-pre[l-1]);
mi=min(mi,now);
}
scout<<mi<<"\n";
}
return 0;
}