洛谷 P1400 塔

题目描述

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

输入输出格式

输入格式:

 

第一行: N,D 第二行: N个数,表示每块砖的长度。

 

输出格式:

 

方案数,输出要mod 1000000009

 

输入输出样例

输入样例#1: 复制
4 1
1 2 3 100
输出样例#1: 复制
4
思路:数学
首先排序,这是大家能想到的第一思路。
其次计算 num[i]--num[i]+d中数的个数,ans每次乘这个数,乘法原理解决。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 1000000009
using namespace std;
int n,d;
int num[600010];
int l,r,mid,ll,rr;
long long ans=1;
bool judge(int i){
    if(num[mid]<=num[i])    return true;
    else return false;
}
bool juddge(int i){
    if(num[mid]<=num[i]+d)    return true;
    else return false;
}
int main(){
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    sort(num+1,num+1+n);
    for(int i=1;i<=n;i++){
        l=1;r=n;
        while(l<=r){
            mid=(l+r)/2;
            if(judge(i))    l=mid+1;
            else r=mid-1;
        }
        ll=1;rr=n;
        while(ll<=rr){
            mid=(ll+rr)/2;
            if(juddge(i))    ll=mid+1;
            else rr=mid-1;
        }
        ans=ans*(ll-l+1)%mod;
    }
    cout<<ans;
}

 

 
posted @ 2017-11-15 20:21  一蓑烟雨任生平  阅读(354)  评论(0编辑  收藏  举报