<codeforces985E. Pencils and Boxes> (单调队列)

题意:n个数 把他们放进一些盒子里 每个盒子最少放k个数 且最小和最大的差不能大于d

题解:显然排个序 对于当前点 存一下前面有哪些节点可以当作结尾

   那么就可以枚举这些点的下一个点作为起点能否和当前点组成合法区间

   找到的第一个大小不超过d的点显然是最优的 这样会使区间尽可能大于k

   如果找到了这个点就把他放入队列 那么就是单调队列了...

#include <bits/stdc++.h>
using namespace std;

int q[500005];
int que[500005];

int main()
{
    int n, k, d;
    cin>>n>>k>>d;
    for(int i = 1; i <= n; i++) scanf("%d", &q[i]);
    sort(q + 1, q + 1 + n);

    int l = 1, r = 1; que[l] = 0;
    for(int i = k; i <= n; i++)
    {
        while(l <= r && q[i] - q[que[l] + 1] > d) l++;
        if(l <= r && i - que[l]>= k) que[++r] = i;
    }
    if(que[r] == n) puts("YES");
    else puts("NO");

    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/lwqq3/p/9074998.html