bzoj 2013: A huge tower 数学

题目:

\(N(2\leq N\leq 620000)\)块砖,要搭一个\(N\)层的塔,要求:如果砖\(A\)在砖\(B\)上面,那么\(A\)不能比\(B\)的长度\(+D\)要长。问有几种方法,输出 答案\(\mod 10^9+9\)的值

题解:

考虑从大到小插入砖块.
可以发现只要满足插入时该砖块与下面的砖块满足条件那么与上面的砖块也满足条件.
也就是说我们只用在乎下砖块是哪个.
所以枚举插入到哪个砖块上面就好了.

可以排序后直接搞.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
    x=0;char ch;bool flag = false;
    while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 620010;
const int mod = 1e9+9;
int a[maxn];
int main(){
    int n,D;read(n);read(D);
    rep(i,1,n) read(a[i]);
    sort(a+1,a+n+1);
    int ans = 1,cnt = 1;
    rep(i,1,n){
		while(cnt < i && a[cnt] + D < a[i]) ++ cnt;
		ans = 1LL*ans*(i - cnt + 1) % mod;
    }printf("%d\n",ans);
    return 0;
}

posted @ 2017-06-14 19:31  Sky_miner  阅读(306)  评论(0编辑  收藏  举报