分析:首先要知道有递推公式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 ;
}

hdu3450的更多相关文章

随机推荐

  1. python自动化测试学习笔记-9python的日志模块

    参考 logging模块,用来处理python中的日志: import logging logging.debug('debug')logging.info('info')logging.warnin ...

  2. STL内存分配方式

    关于STL用的很多比如map, vector, set, queue, stack等等.很少关注它的内存分配情况,但是经常遇到比如使用map,不停的在map中插入了一些很小的对象,然后释放了一些,然后 ...

  3. scala学习笔记2:面向对象编程部分基础

    以下主要记录的是看完scala in programming这本书Functional Objects(第六章)后的要点总结. 1,程序中可变对象(var)和不可变对象(val)使用的权衡问题 不可变 ...

  4. 【Android学习笔记】Mac下Android Studio开发环境搭建

    本文由@ray 出品,转载请注明出处.  文章链接:http://www.cnblogs.com/wolfray/p/7829069.html 对于移动端这块,笔者之前一直都是进行iOS开发的,也从来 ...

  5. 连接服务器的mysql

    在服务器配置好Mysql 数据库,在客户端连接,报错: 解决方法: 1.在MySQL 数据库中修改user表,将host 中的localhoust 改为 %: 2.配置访问数据库的全选 根据需要配置权 ...

  6. 面试中的一些小问题之html5和html4的区别?

    HTML5建立的一些新规则: 新特性应该基于HTML.CSS.DOM.JavaScript: 减少对外部插件的需求,如flash将会用video标签和audio标签代替: 更加优秀的错误处理: 更多取 ...

  7. UVM基础之------uvm phases机制

    代码的书写顺序会影响代码的实现,在不同的时间做不同的事情,这是UVM phase的设计哲学,UVM phase提供了一个通用的TB phase 解决方案.支持显示的隐式的同步方案,运行时刻的线程控制和 ...

  8. PHP开发心得一

    1,php获得服务器时间 $time= date('Y-m-d H:i'); echo $time; 一般写法如上,但发现打印出来的时间小时数总数不对,和机器的时间差几个小时.查资料发现,要设定时区. ...

  9. SQL Server的安装笔记

    SQL安装笔记 安装SQL Server 2008 打开SQL Server 2008中的setup.exe,显示SQL安装程序的对话框. 提示必须安装相关组件Microsoft.NET Framew ...

  10. mysqlbinlog flashback 使用最佳实践

    mysqlbinlog限制 该软件利用binlog中记录了操作前的数据镜像和操作后的数据镜像.有如下限制 1)binlog_format=row 2)必须打开binlog 3)只支持insert.up ...