#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
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 31 | 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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
常用链接
留言簿
随笔分类
随笔档案
搜索
最新随笔
最新评论
Powered By: 博客园 模板提供:沪江博客
|