E. Pencils and Boxes(划窗+dp+树状数组)
题目
题意:
给定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+树状数组)相关推荐
- 树形DP+树状数组 HDU 5877 Weak Pair
1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...
- 赤壁之战(dp树状数组)
给定一个长度为N的序列A,求A有多少个长度为M的严格递增子序列. 输入格式 第一行包含整数T,表示共有T组测试数据. 每组数据,第一行包含两个整数N和M. 第二行包含N个整数,表示完整的序列A. 输出 ...
- 小魂和他的数列(dp+树状数组优化)
链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...
- 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)
题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...
- dp 树状数组 逆序元组
wmq的队伍 发布时间: 2017年4月9日 17:06 最后更新: 2017年4月9日 17:07 时间限制: 2000ms 内存限制: 512M 描述 交大上课需要打卡,于是在上课前的 ...
- 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 ...
- HDU 2836 Traversal 简单DP + 树状数组
题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...
- Codeforces 1096F(dp + 树状数组)
题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...
- 51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...
最新文章
- Error:(49, 1) A problem occurred evaluating project ':guideview'. Could not read script 'https://r
- android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
- three.js写的游戏
- 调试CEF3程序的方法
- 【面试必备】Swiftamp;nbsp;面试题及其答案
- Android的多任务之路
- Android的ADB工具使用
- uva 1625——Color Length
- java gson 工具类_GSON 实体 转换工具类
- Spring Security源码分析之LogoutFilter
- Oracle11gr2新增APPEND_VALUES提示
- ArcMAP 空间连接和相交工具使用
- 宋宝华:关于Ftrace的一个完整案例
- 代理IP软件如何只切换浏览器IP地址
- 下拉框输入模糊查询_高考英语听力考试查询、网上填报志愿时间、诈骗陷阱提防!全在这里了...
- 获取今天是星期几的四种写法
- 2013年春节前订票经历及经验分享
- FPS透视自瞄基本概念
- 漏洞系列之——SQL注入
- CSS实现超级炫酷的流光按钮效果
热门文章
- 操作系统 精髓与设计原理 第三章部分题目
- Matlab模拟仿真模糊PID(Fuzzy)
- Elasticsearch的这几个概念你还不知道啥意思呢?
- python restful接口返回类型出错_使用Python和Flask返回API错误消息
- python下载电影视频_python爬虫:抓取下载电影文件,合并ts文件为完整视频
- 树莓派(raspberry pi)日记1之个人网站的构建(localhost内网穿透实现公网可以访问)
- MG90舵机转角控制
- Python pandas在读取csv文件时(linux与windows之间传输),数据行数不一致的问题
- Anaconda3 导入外部环境报错
- 在VMware中安装CentOS7(超详细的图文教程)