题目

题意:

    给定n个数,要求将n个数划分为若干集合。要求每个集合大小至少为k,且集合元素两两差值不大于d。
    1≤k≤n≤5⋅105,0≤d≤109,1≤ai≤1091 ≤ k ≤ n ≤ 5·10^5, 0 ≤ d ≤ 10^9,1 ≤ a_i ≤ 10^91 ≤ k ≤ n ≤ 5⋅105,0 ≤ d ≤ 109,1 ≤ ai​ ≤ 109

分析:

    要求集合内元素差值不超过d,也就是最大值与最小值的差值不能超过d。所以我们肯定按顺序形成集合。对于一个元素来说,它既可以自己作为集合首元素与后面的元素形成集合,也可以与前面某些元素形成集合。有两种选择自然就想到dp了,dp[i]表示[i,n]这个区间以i开头形成集合是否能满足题意。那么它就能从dp[l]…dp[r]这个区间只要有一个为1那么dp[i]就可以为1(区间是[i+k,i之后第一个元素-a[i]>d的下标])。所以区间和大于0即可,用树状数组维护一下,至于右区间需要用划窗预处理一下。

#include <iostream>
#include <algorithm>
using namespace std;int a[500005],last[500005];
int dp[500005],c[500005];
int n;int lowbit(int x)
{return x & -x;
}void update(int x,int k)
{for (int i = x; i <= n + 1; i += lowbit(i)){c[i] += k;}
}int query(int x)
{int res = 0;if( x > n+1 ) x = n + 1;for (int i = x; i > 0; i -= lowbit(i)){res += c[i];}return res;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int k,d;cin >> n >> k >> d;for (int i = 1; i <= n; i++){cin >> a[i];} sort(a+1,a+1+n);int end = 1;for (int i = 1; i <= n; i++){while( a[end] - a[i] <= d && end <= n ){end ++;}last[i] = end - 1;//cout << i << ' ' << last[i] << '\n';}update(n+1,1);for (int i = n; i >= 1; i--){int l = i + k,r = last[i] + 1;//if( l > n ) continue;if( query(r) - query(l-1) > 0 ){dp[i] = 1;update(i,1);}}if( dp[1] ) cout << "YES" << '\n';else cout << "NO" << '\n';return 0;
}

E. Pencils and Boxes(划窗+dp+树状数组)相关推荐

  1. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  2. 赤壁之战(dp树状数组)

    给定一个长度为N的序列A,求A有多少个长度为M的严格递增子序列. 输入格式 第一行包含整数T,表示共有T组测试数据. 每组数据,第一行包含两个整数N和M. 第二行包含N个整数,表示完整的序列A. 输出 ...

  3. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  4. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

  5. dp 树状数组 逆序元组

    wmq的队伍 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 2000ms   内存限制: 512M 描述 交大上课需要打卡,于是在上课前的 ...

  6. BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...

  7. HDU 2836 Traversal 简单DP + 树状数组

    题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...

  8. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  9. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

最新文章

  1. 重构alert,confirm
  2. 强制杀oracle进程
  3. 调用远程摄像头进行人脸识别_人脸识别技术植入手机APP
  4. Idea打Jar包的坑,工程使用ali druid 等ali组件
  5. [开源] FreeSql.Tools Razor 生成器
  6. 使用Cygwin实现vlc 1.0.5的wince移植
  7. 手把手教你用.NET Core写爬虫
  8. 观点对立,无关虚拟现实技术
  9. js实现一键复制到剪切板上_js实现各种复制到剪贴板的方法(分享)
  10. 各位有什么超实用的生活小窍门呢?
  11. 罗技dpi计算机配置文件,罗技游戏鼠标的配置文件修改方法 Logitech 游戏软件为游戏鼠标的配置文件设置不同的 DPI...
  12. 电驴搜索服务器正在连接,电驴连接不上服务器导致无法搜索解决的方法介绍
  13. flex的dataGrid:用checkbook和弹出窗口修改,返回修改本行
  14. python用函数对列表删除_关于python:如何使用range()函数从列表中删除项目时迭代列表?...
  15. 社工工具包 SEToolkit
  16. 前端 几个好看的button
  17. sim卡没坏但苹果手机无服务_工信部为啥要喊你设置SIM卡密码?如何设置(安卓苹果都有了)|工信部|手机|安卓|安卓手机|iphone...
  18. 吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第二节:神经网络基础(上)
  19. 学习JBPM 工作流引擎 API方法(二)
  20. Glide的使用回收内存问题

热门文章

  1. Mac删除默认美国输入法
  2. MYSQL的CRUD
  3. 怎么破解wifi密码?如何破解无线路由器密码?
  4. qt QGraphicsItem自绘鼠标形状
  5. 简单地实现文章的查重
  6. 花了两个月,研究了多家大厂的岗位JD,发现.....
  7. socket.read()的阻塞问题
  8. 展讯平台初步调试笔记
  9. bzoj2844:albus就是要第一个出场(线性基)
  10. linux nvidia显卡参数设置,硬件设置 – Nvidia显卡 - Linux Mint 学习笔记