#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
 struct point {
int x,y;
}p[100010];
int c[100010],n,d,a[100010],map[100010],t;
 bool cmp(point p0,point p1) {
return p0.x<p1.x;
}
 int lowbit(int x) {
return x&(-x);
}
 int sum(int x) {
int s=0;
 while(x) {
s=(s+c[x])%9901;
x-=lowbit(x);
}
return s;
}
 int update(int x,int y) {
 while(x<=n) {
c[x]=(c[x]+y)%9901;
x+=lowbit(x);
}
}
 int find(int x,bool y) {
int l=1,r=n,m,ans=-1;
 if(y) {
 while(l<=r) {
m=(l+r)>>1;
 if(p[m].x>=x) {
ans=m;
r=m-1;
}
else l=m+1;
}
 }else {
 while(l<=r) {
m=(l+r)>>1;
 if(p[m].x<=x) {
ans=m;
l=m+1;
}
else r=m-1;
}
}
return ans;
}
 int main() {
 while(scanf("%d%d",&n,&d)!=EOF) {
memset(c,0,sizeof(c[0])*(n+1));
 for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
p[i].x=a[i];
p[i].y=i;
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)map[p[i].y]=i;
 for(int i=1;i<=n;i++) {
int l=find(a[i]-d,1),r=find(a[i]+d,0);
 if(l+1&&r+1&&l<=r) {
t=(9901+sum(r)-sum(l-1)+1)%9901;//+1巧妙之处,用于标记是否被更新,答案再减去n即可
update(map[i],t);
}
}
printf("%d\n",(9901*20+sum(n)-n)%9901);
}
return 0;
}

|
|
CALENDER
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
23 | 24 | 25 | 26 | 27 | 28 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 |
|
常用链接
留言簿
随笔分类
随笔档案
搜索
最新随笔
最新评论

Powered By: 博客园 模板提供:沪江博客
|