bzoj2013

按照长度排序
f[i] 前i个元素的排列方式
考虑对于前i-1的元素的排列,第i个元素可以插入的合法位置为x
f[i]=f[i1]x
在排好序的序列中二分找可以插入的位置满足a[i]<=a[k]+D

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 620005
#define mod 1000000009
#define LL long long
using namespace std;
int n,D;
LL  ans;
int a[maxn];
int main()
{
    scanf("%d%d",&n,&D);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    ans=1;
    int t;
    for(int i=2;i<=n;i++){
        t=lower_bound(a+1,a+i+1,a[i]-D)-a;
        t=(i-t+1);
        ans=(ans*1ll*t)%mod;
    }
    printf("%lld\n",ans%mod);
    return 0;
}
posted @ 2017-10-26 20:58  HunterxHunterl  阅读(120)  评论(0编辑  收藏  举报