思路:
先对a数组排序,然后使用动态规划。dp[i]表示前i个能否正确划分。则如果存在dp[j] == 1, i - j + 1 >= k并且a[i] - a[j] < d,那么dp[i] = 1,否则dp[i] = 0。可以使用树状数组对区间查询操作进行优化。复杂度O(n * log(n))。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 500005; 4 int n, k, d, a[MAXN], bit[MAXN]; 5 inline int lowbit(int x) { return x & -x; } 6 void add(int i, int x) 7 { 8 while (i <= n) { bit[i] += x; i += lowbit(i); } 9 } 10 int sum(int i) 11 { 12 if (i < 0) return -1; 13 if (!i) return 1; 14 int ans = 0; 15 while (i) { ans += bit[i]; i -= lowbit(i); } 16 return ans + 1; 17 } 18 int main() 19 { 20 while (cin >> n >> k >> d) 21 { 22 memset(bit, 0, sizeof bit); 23 for (int i = 1; i <= n; i++) cin >> a[i]; 24 sort(a + 1, a + n + 1); 25 for (int i = 1; i <= n; i++) 26 { 27 int pos = lower_bound(a + 1, a + n + 1, a[i] - d) - a; 28 if (i - pos + 1 < k) continue; 29 if (sum(i - k) - sum(pos - 2) >= 1) add(i, 1); 30 } 31 cout << (sum(n) - sum(n - 1) ? "YES" : "NO") << endl; 32 } 33 return 0; 34 }