题目

题意:

    给定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. Error:(49, 1) A problem occurred evaluating project ':guideview'. Could not read script 'https://r
  2. android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
  3. three.js写的游戏
  4. 调试CEF3程序的方法
  5. 【面试必备】Swiftamp;nbsp;面试题及其答案
  6. Android的多任务之路
  7. Android的ADB工具使用
  8. uva 1625——Color Length
  9. java gson 工具类_GSON 实体 转换工具类
  10. Spring Security源码分析之LogoutFilter
  11. Oracle11gr2新增APPEND_VALUES提示
  12. ArcMAP 空间连接和相交工具使用
  13. 宋宝华:关于Ftrace的一个完整案例
  14. 代理IP软件如何只切换浏览器IP地址
  15. 下拉框输入模糊查询_高考英语听力考试查询、网上填报志愿时间、诈骗陷阱提防!全在这里了...
  16. 获取今天是星期几的四种写法
  17. 2013年春节前订票经历及经验分享
  18. FPS透视自瞄基本概念
  19. 漏洞系列之——SQL注入
  20. CSS实现超级炫酷的流光按钮效果

热门文章

  1. 操作系统 精髓与设计原理 第三章部分题目
  2. Matlab模拟仿真模糊PID(Fuzzy)
  3. Elasticsearch的这几个概念你还不知道啥意思呢?
  4. python restful接口返回类型出错_使用Python和Flask返回API错误消息
  5. python下载电影视频_python爬虫:抓取下载电影文件,合并ts文件为完整视频
  6. 树莓派(raspberry pi)日记1之个人网站的构建(localhost内网穿透实现公网可以访问)
  7. MG90舵机转角控制
  8. Python pandas在读取csv文件时(linux与windows之间传输),数据行数不一致的问题
  9. Anaconda3 导入外部环境报错
  10. 在VMware中安装CentOS7(超详细的图文教程)