E. Pencils and Boxes | Educational Codeforces Round 44
int N, K, D; cin >> N >> K >> D; vi A(N); // とりあえずソートしておく rep(a, N)cin >> A[a]; sort(all(A)); vi in(N+1), out(N+1); // 小さい方から0個をすべて使って箱詰めできている in[0] = 1; out[0] = 1; ll cur = 0; rep(a, N) { cur += in[a]; // 小さい方からa個すべて使って箱詰めできている if (cur > 0) { // 少なくともK個使わなければならない。 // より大きな鉛筆と一緒に詰めるために // いくつかの鉛筆を入れなくて良い。 // その場合、差がD以下に収まりやすいように、小さいものは // すべてまとめたほうがいい。(小さい方から少なくともK個) int L = a + K; // 差がDを超えない範囲ですべて使える int R = lower_bound(all(A), A[a] + D + 1) - A.begin(); // 小さい方から、L<=b<=R個使って構成できる if (L <= R) { in[L]++; out[R]++; } } cur -= out[a]; } if (cur+in[N] > 0)cout << "YES" << endl; else cout << "NO" << endl;