zoukankan      html  css  js  c++  java
  • CF985E Pencils and Boxes

    思路:

    先对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 }
  • 相关阅读:
    IDEA调试快捷键
    视频预览
    文件上传:简单的demo
    Java 运行时优化
    Java 类加载
    Java StringTable
    Java 为什么不用Vector
    C++ 查找函数
    JVM 垃圾回收
    JVM 直接内存
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9076577.html
Copyright © 2011-2022 走看看