Sicily9162(单调队列)

先排序再维护每个区间的最小值。

#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;
} 


你可能感兴趣的:(Sicily9162(单调队列))