去吧皮卡丘
Educational Codeforces Round 44 (Rated for Div. 2)
题意:给定n,k,d,表示给你n支铅笔,每支有一个权值v。现在让你把n支笔放入一些盒子中(盒子数量可以无穷大),每个盒子中至少有k支笔,而且每个盒子中的最大笔的值与最小笔的值不超过d。问你能否找到一个合法的放法,可以输出"YES",否则输出"NO"。
思路:排序是不可能的啦,这辈子都不可能排序的(才怪),因为有最大值和最小值差值的关系,肯定是要排序的(真香)。这个题有三个要点1.每个箱子里能放的笔越多越好,所以在尺取法的时候,对于每一个起点终点越靠后越好,2.而维护过的终点不需要维护第二遍,所以设定一个指针让他持续++就可以了3.当一个终点符合的时候下一个点可以作为起点。
了解这三个要点就可以愉快的写题题啦(呕)
(浙江省赛真的已经在补了,别打了,别打了,主要是权值线段树还在学,啊啊,我知道我弱了,别打了,再打就鞭尸了,对对还有矩阵快速幂一直都这么垃圾,“上次林大题你瞅你那死出” 落寞的哭泣ing,,,): (😭

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ls rt<<1
#define rs rt<<1|1
#define pb push_back
#define fi first
#define se second
#define yes puts("YES")
#define no puts("NO")
#define ios ios::sync_with_stdio(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef vector<int> VI;
const LL N = 5e5+9,M=5e4;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
LL qp(LL x,LL y){LL ans=1;x%=mod;while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans;}
LL inv(LL x){return qp(x,mod-2);}
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
///head
int n, k, d;
int a[N], ac[N], st[N];
int main() {
    while(~scanf("%d %d %d",&n , &k, &d)){
        memset(st , 0 , sizeof st);
        memset(ac , 0 , sizeof st);
        for(int i = 1 ;i <= n ;i ++){
            scanf("%d", &a[i]);
        }
        sort(a + 1 , a + n + 1);
        st[1] = 1;
        ac[0] = 1;
        int e = 1;
        for(int i = 1 ; i <= n ; i ++){
            if(st[i]){
                while(a[e] - a[i] <= d && e <= n){
                    if(e - i + 1 >= k){
                        ac[e] = 1;
                        st[e + 1] = 1;
                    }
                    e ++;
                }
            }
        }
        if(ac[n]) yes;
        else no;
    }
}