https://vjudge.net/problem/HDU-3450
直接用dp[i]表示以最后一个结尾的完美序列的个数。。
然后就可以用树状数组优化了
int num[N],val[N],cnt,tree[N<<2];
const int maxn=500010;
int d,n;
int dp[N];
int haxi(int x){
return lower_bound(val+1,val+1+cnt,x)-val;
}
int lowbit(int x){return x&(-x);}
int query(int x){
int ret=0;
while(x){
ret+=tree[x];
x-=lowbit(x);
}
return ret%mod;
}
void add(int x,int v){
while(x<=maxn){
tree[x]+=v;
tree[x]%=mod;
x+=lowbit(x);
}
}
int main(){
//freopen("in.txt","r",stdin);
while(~sf("%d%d",&n,&d)){
mem(tree,0);
cnt=0;
rep(i,1,n){ sf("%d",&num[i]);val[++cnt]=num[i];val[++cnt]=num[i]+d;val[++cnt]=num[i]-d; }
sort(val+1,val+1+cnt);
cnt=unique(val+1,val+1+cnt)-val;
int ans=0;
for(int i=1;i<=n;++i){
int x=query(haxi(num[i]+d))-query(haxi(num[i]-d)-1);
dp[i]=(x+mod)%mod;
ans+=x;
add(haxi(num[i]),dp[i]+1);
//pf("%d\n",dp[i]);
}
ans=(ans+mod)%mod;
pf("%d\n",ans);
}
}