分析:首先要知道有递推公式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,正因为这样可以用树状数组对这种加法进行加速,只要先用二分查找出区间两端点对应在树状数组里面的下标。

  1. #pragma warning(disable:4996)
  2. #include <cstdio>
  3. #include <set>
  4. #include <stack>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <map>
  8. #define MOD 9901
  9. using namespace std;
  10. int bit[];//bit -- binary indexed tree
  11. int a[], order[], len;
  12. int lowBit(int x){
  13. return x & (-x);
  14. }
  15. //size是数组的大小,val是增量
  16. void update(int idx, int size, int val){
  17. while (idx <= size){
  18. bit[idx] += val;
  19. if (bit[idx] >= MOD){
  20. bit[idx] %= MOD;
  21. }
  22. idx += lowBit(idx);
  23. }
  24. }
  25. //求a[1]到a[idx]的连续子序列的和
  26. int sum(int idx){
  27. int ret = ;
  28. while (idx > ){
  29. ret += bit[idx];
  30. if (ret >= MOD){
  31. ret %= MOD;
  32. }
  33. idx -= lowBit(idx);
  34. }
  35. return ret;
  36. }
  37. int main(){
  38. int n, d, len;
  39. while (~scanf("%d%d", &n, &d)){
  40. for (int i = ; i <= n; i++){
  41. scanf("%d", &a[i]);
  42. }
  43. copy(a + , a + + n, order + );
  44. sort(order + , order + + n);
  45. len = unique(order + , order + + n) - order - ;
  46. memset(bit, , sizeof(bit));
  47. for (int i = ; i <= n; i++){
  48. int r = upper_bound(order + , order + + len, a[i] + d) - order - ;
  49. int l = lower_bound(order + , order + + len, a[i] - d) - order - ;
  50. int p = lower_bound(order + , order + + len, a[i]) - order;
  51. int temp = sum(r) - sum(l);
  52. temp = (temp % MOD + MOD) % MOD;
  53. update(p, len, temp + );
  54. }
  55. printf("%d\n", ((sum(len) - n) % MOD + MOD) % MOD);
  56. }
  57. return ;
  58. }

hdu3450的更多相关文章

随机推荐

  1. php可以定义数组的常量吗

    是这样吗?<?php define('BEST_PHPER',array('name'=>'巩文','address'=>'china')); My God,明确告诉你不可以:原因是 ...

  2. 洛谷 P3378 【模板】堆(小根堆)

    题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...

  3. 不讲CRUSH的Ceph教程是不完整的

    前面我们提到了Ceph是一个支持统一存储架构的分布式存储服务.简单介绍了Ceph的基本概念和基础架构包含的组件,其中最重要的就是底层的RADOS和它的两类守护进程OSD and Monitor.上篇文 ...

  4. datagrid上面的查询按钮设置了,但是分页工具栏不显示

    原因:查询的linkbutton没有放在toolbar里. <script type="text/javascript"> $(function(){ $('#dg') ...

  5. C:\Windows\System32\drivers\etc\hosts文件显示

     attrib -s -h C:\Windows\System32\drivers\etc\hosts 

  6. CF864D Make a Permutation!

    思路: 贪心,构造,模拟. 实现: #include <bits/stdc++.h> using namespace std; ], a[], vis[], n; int main() { ...

  7. SAS进阶《深入分析SAS》之数据汇总和展现

    SAS进阶<深入分析SAS>之数据汇总和展现 1. 通过Print过程制作报表 proc print <data=数据集>; run; 选项: obs=修改观测序号列标签 no ...

  8. Hive扩展功能(九)--Hive的行级更新操作(Update)

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...

  9. OpenTSDB监控

    OpenTSDB监控

  10. Linux(Centos7) 设置静态IP

    关于虚拟机 这里使用Centos7为例,因为linux是安装在在虚拟机中,这里先看一下虚拟机的网络适配器: 这里我使用的NAT模式,接着配置虚拟机的虚拟网络: 这里主要看一下VMnet8的设置: 这里 ...