分析:首先要知道有递推公式dp[i] = Sigma(dp[j]),dp[i]表示第i个数结尾的完美子序列的个数,|a[i] - a[j]| <= d,j<i。直接这样做的时间复杂度为n^2,对于最大有100000的n还是会超时的,留意到公式是连续加的(j<i 时,以[a[i] - d, a[i] + d]区间里面的数结尾的完美子序列个数相加),其实j>i的[a[i] - d, a[i] + d]区间里面的数结尾的完美子序列个数也可以加进去,只要初始化都为0,正因为这样可以用树状数组对这种加法进行加速,只要先用二分查找出区间两端点对应在树状数组里面的下标。

 #pragma warning(disable:4996)
#include <cstdio>
#include <set>
#include <stack>
#include <vector>
#include <algorithm>
#include <map>
#define MOD 9901
using namespace std;
int bit[];//bit -- binary indexed tree
int a[], order[], len;
int lowBit(int x){
return x & (-x);
}
//size是数组的大小,val是增量
void update(int idx, int size, int val){
while (idx <= size){
bit[idx] += val;
if (bit[idx] >= MOD){
bit[idx] %= MOD;
}
idx += lowBit(idx);
}
}
//求a[1]到a[idx]的连续子序列的和
int sum(int idx){
int ret = ;
while (idx > ){
ret += bit[idx];
if (ret >= MOD){
ret %= MOD;
}
idx -= lowBit(idx);
}
return ret;
}
int main(){
int n, d, len;
while (~scanf("%d%d", &n, &d)){
for (int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
copy(a + , a + + n, order + );
sort(order + , order + + n);
len = unique(order + , order + + n) - order - ;
memset(bit, , sizeof(bit));
for (int i = ; i <= n; i++){
int r = upper_bound(order + , order + + len, a[i] + d) - order - ;
int l = lower_bound(order + , order + + len, a[i] - d) - order - ;
int p = lower_bound(order + , order + + len, a[i]) - order;
int temp = sum(r) - sum(l);
temp = (temp % MOD + MOD) % MOD;
update(p, len, temp + );
}
printf("%d\n", ((sum(len) - n) % MOD + MOD) % MOD);
}
return ;
}

最新文章

  1. 扩展欧几里得 exGCD
  2. (转)在MAC上查找和设置$JAVA_HOME
  3. IN31志愿者“孝行天下,感恩父母”晚会
  4. EntityFramework动态多条件查询与Lambda表达式树
  5. FOR ALL ENTRIES IN 与 INNER JOIN 写在一个SQL上影响效率
  6. hdu1251 字典树or map
  7. git创建分支并提交项目
  8. Redis 起步
  9. Objective-C中NSArray和NSMutableArray是如何使用的?
  10. [转] ubuntu 12.04 安装 nginx+php+mysql web服务器
  11. DontDestroyOnLoad
  12. COJN 0486 800401反质数 呵呵呵呵呵
  13. Sort List (使用归并排序的链表排序)
  14. iOS- 三步快速集成社交化分享工具ShareSDK
  15. 最小的MVC工程
  16. DFS算法(——模板习题与总结)
  17. Linux shell 脚本(二)
  18. Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
  19. 谷歌浏览器添加JSON-handle插件
  20. .12-浅析webpack源码之NodeWatchFileSystem模块总览

热门文章

  1. java 读取word
  2. [Usaco2018 Open]Milking Order
  3. focus、click、blur、display、float、border、absolute、relative、fixed
  4. ADB Usage Complete / ADB 用法大全
  5. 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
  6. (3)左右值再探与decltype
  7. 网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出
  8. oracle添加联合主键
  9. arx 移动界面到一点
  10. bazel和TensorFlow安装