分析:首先要知道有递推公式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. java io 文件下载

    /** * 文件下载 * @param response * @param downloadPath * @param docName */ public void downLoadFile( Htt ...

  2. Get 和 Post 使用篇(1)

    1.Post 请求发送方式 实例: const string sResponseEncoding = "gb2312"; //测试文本信息 string postText = &q ...

  3. HDU 1879(最小生成树)

    #include "iostream" #include "algorithm" #include "cstdio" using names ...

  4. 365 Water and Jug Problem 水壶问题

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水.你允许:    装满任 ...

  5. CircuitBreaker design pattern---reference

    It's common for software systems to make remote calls to software running in different processes, pr ...

  6. C#模拟百度登录并到指定网站评论回帖(四)

    基本的实现功能前面已经全部讲完,基本上可以复制黏贴完成登录百度的过程了 今天的这一贴就说说怎么获取百度的验证码 内容回顾:还记得前面第一贴说的如果登录发生异常,百度会发回2个值吗?是的,就是codeT ...

  7. Mysql阿里数据源配置参考

    maven pom.xml配置 <dependency> <groupId>com.alibaba</groupId> <artifactId>drui ...

  8. 这样的设计是否有违背MVC设计原则??

    MVC 皆知为 Model-View-Controller 请求模型-〉Client发现请求-〉Controller接收+处理-〉返回Model给前端-〉前端接收处理模型Result 但是最近发现一个 ...

  9. Python学习日记之文件读取操作

    Python内置了文件读写的函数open,read 用法示例: open('/home/root/files.txt ') 在打开文件后,操作完成后可以使用close()关闭文件,但比较好的文件读写方 ...

  10. Android Bitmap转换WebP图片导致损坏的分析及解决方案

    背景 作为移动领域所力推的图片格式,WebP图片在商业领域证明了其应有的价值.基于其他格式的横向对比,其在压缩性能表现,及还原度极为优秀,节省大量的带宽开销.基于可观的效益比,团队早前已开始磋商将当前 ...