题目大意

给定n个不同的整数,求将它们分成两个集合X,Y,并且X集合中任意两个数的差>=A,Y集合中任意两个数的差>=B的方案数。

样例输入

5 3 7

1

3

6

9

12

样例输出

5

解析

不妨设\(A>B\),那么考虑如何动态规划。设\(f[i]\)表示第一个集合最后选择的数是i时的方案数。只用枚举第一个集合前一个选的数是哪一个即可转移。但 这么做是\(O(n^2)\)的。考虑从能够转移的点的性质出发。

对于能够转移到i的j,必须要满足的条件有

  • \(S_i-S_j >= A\)
  • 对于\([j+1,i-1]\)中的数,满足任意两个数\(x,y\)都有\(S_y-S_x>=B\)

可以发现满足条件的j是一段连续位置。因此采用前缀和优化即可。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
#define N 100002
using namespace std;
const int mod=1000000007;
int n,a,b,i,m[N],sum[N],f[N];
int read()
{
char c=getchar();
int w=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0'){
w=w*10+c-'0';
c=getchar();
}
return w;
}
signed main()
{
n=read();a=read();b=read();
if(a>b) swap(a,b);
for(i=1;i<=n;i++) m[i]=read();
sort(m+1,m+n+1);
for(i=3;i<=n;i++){
if(m[i]-m[i-2]<a){
puts("0");
return 0;
}
}
int l=0,r=0,ans=0;
sum[0]=f[0]=1;
for(i=1;i<=n;i++){
while(r<i-1&&m[i]-m[r+1]>=b) r++;
if(l<=r) f[i]=(sum[r]-sum[l-1]+mod)%mod;
sum[i]=(sum[i-1]+f[i])%mod;
if(i>1&&m[i]-m[i-1]<a) l=i-1;
}
for(i=n;i>=0;i--){
ans=(ans+f[i])%mod;
if(i<n&&m[i+1]-m[i]<a) break;
}
printf("%lld\n",ans);
return 0;
}

最新文章

  1. SpringMVC@RequestBody小细节
  2. 【转载】Extjs 中id与itemId的区别
  3. 第二篇、微信程序尺寸rpx
  4. 【转】COCOS2D-X之CCHttpRequest下载图片Demo
  5. (一)学习MVC之制作验证码
  6. 禁止button响应回车(.net页面)
  7. 【转】Entity Framework教程
  8. 分享一个js生成二维码的库
  9. w3school教程整理
  10. mysql 权限控制具体解释
  11. 解决windows7搜索不了txt文本内容的问题
  12. [转帖]流程控制:for 循环
  13. 10分钟了解JSON Web令牌(JWT)
  14. 代码d17
  15. EF将IEnumerable&lt;T&gt;类型转换为Dictionary&lt;T,T&gt;类型
  16. 九度OJ1205题-递归求解问题
  17. 教程 | Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
  18. Simple2D-25 精灵动作
  19. OpenStack介绍(一)
  20. C++设计一个不能被继承的类

热门文章

  1. 在 Windows 10 上用超级终端配置 Cisco 3560 Series
  2. HanLP-分类模块的分词器介绍
  3. 关于maven自动部署tomcat9 步骤
  4. myeclipse中jpa的安装以及jpa reverse engining
  5. [LGP5115] Check,Check,Check one two!
  6. linux小白家教学&lt;一&gt;
  7. python并发编程-进程理论-进程方法-守护进程-互斥锁-01
  8. QThread::wait(),一直以来我以为它阻塞的是QThread对象,可是我现在明白,原来阻塞的是这个对象所在的线程(通常是主线程)——所有事情源于 QThread 的事件循环——如果使用继承QThread这一方法,QThread::quit()没有效果,因为这个线程根本就不需要事件循环
  9. redis 学习(6)-- 集合类型
  10. js中的奇闻异事