hdu3450
2024-09-07 02:03:18
分析:首先要知道有递推公式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 ;
}
最新文章
- 扩展欧几里得 exGCD
- (转)在MAC上查找和设置$JAVA_HOME
- IN31志愿者“孝行天下,感恩父母”晚会
- EntityFramework动态多条件查询与Lambda表达式树
- FOR ALL ENTRIES IN 与 INNER JOIN 写在一个SQL上影响效率
- hdu1251 字典树or map
- git创建分支并提交项目
- Redis 起步
- Objective-C中NSArray和NSMutableArray是如何使用的?
- [转] ubuntu 12.04 安装 nginx+php+mysql web服务器
- DontDestroyOnLoad
- COJN 0486 800401反质数 呵呵呵呵呵
- Sort List (使用归并排序的链表排序)
- iOS- 三步快速集成社交化分享工具ShareSDK
- 最小的MVC工程
- DFS算法(——模板习题与总结)
- Linux shell 脚本(二)
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
- 谷歌浏览器添加JSON-handle插件
- .12-浅析webpack源码之NodeWatchFileSystem模块总览
热门文章
- java 读取word
- [Usaco2018 Open]Milking Order
- focus、click、blur、display、float、border、absolute、relative、fixed
- ADB Usage Complete / ADB 用法大全
- 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
- (3)左右值再探与decltype
- 网页内容爬取:如何提取正文内容 BEAUTIFULSOUP的输出
- oracle添加联合主键
- arx 移动界面到一点
- bazel和TensorFlow安装