先排序再维护每个区间的最小值。
#include <iostream>
#include <cstdio>
#include <deque>
#include <algorithm>
using namespace std;
struct S
{
int data;
int pos;
}dis[1000000];
int main()
{
const int maxn=1000000000;
int N,K;
deque<S> Q;
scanf("%d%d",&N,&K);
int i;
int A[1000000];
for (i=0;i<=N-1;i++)
scanf("%d",&A[i]);
sort(A,A+N);
for (i=0;i<=N-2;i++)
{
dis[i].data=abs(A[i+1]-A[i]);
dis[i].pos=i;
}
int minn=maxn;
int pos=0;
for (i=0;i<=K;i++)
{
if (!Q.empty() && Q.front().pos<i)
Q.pop_front();
while (pos<=i+N-1-K-1)
{
while (!Q.empty() && Q.back().data>dis[pos].data)
Q.pop_back();
while (!Q.empty() && Q.front().data>dis[pos].data)
Q.pop_front();
Q.push_back(dis[pos]);
pos++;
}
int dmax=abs(A[i+N-1-K]-A[i]);
int dmin=Q.front().data;
if (dmax+dmin<minn)
minn=dmax+dmin;
//printf("dmaxmin %d:%d\n",dmax,dmin);
}
printf("%d\n",minn);
return 0;
}