zoukankan      html  css  js  c++  java
  • 【BZOJ2013】[Ceoi2010]A huge tower

    2013: [Ceoi2010]A huge tower

    Time Limit: 10 Sec  Memory Limit: 259 MB
    Submit: 387  Solved: 260
    [Submit][Status][Discuss]

    Description

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

    Input

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

    Output

    方案数。输出要mod1000000009

    Sample Input

    4 1
    1 2 3 100

    Sample Output

    4

    HINT

    Source

    辣(si)鸡(lu)题目毁我人生

    感谢lrh提供的思路

    是这样的 我们考虑每一个元素能放在哪里

    我们假设上一步的某一种方案是f

    先排序,保证我一定能放在所有数的下方(不考虑该数原本的底下的数的大小)

    我们会发现所有小于等于a[i]-d的都能放在a[i]下方,那么方案数ans[f]*=a[i]-d+1(放在0上头)

    接下来我们要尝试证明为什么这样不会造成错误,即假如原本某个方案不合法,这样为什么能保证其依然不合法

    我们举个例子 以样例例子

    2 1 3 我们已经放好了三个数

    这个时候,假如我们将100放到1 3或2 1中间,一定不能让方案成立(因为当前的数是前i个中最大的,将某个数替换后不会让答案变好只会让答案变差)

    如果我们放在前边或者后边,方案也不可能成立,所以这部分答案不需要计算

    代码实现非常短

    /*To The End Of The Galaxy*/
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<iomanip>
    #include<stack>
    #include<map>
    #include<set>
    #include<cmath>
    #define debug(x) cerr<<#x<<"="<<x<<endl
    #define INF 0x7f7f7f7f
    #define llINF 0x7fffffffffffll
    using namespace std;
    typedef pair<int,int> pii;
    typedef long long ll;
    inline int init()
    {
        int now=0,ju=1;char c;bool flag=false;
        while(1)
        {
            c=getchar();
            if(c=='-')ju=-1;
            else if(c>='0'&&c<='9')
            {
                now=now*10+c-'0';
                flag=true;
            }
            else if(flag)return now*ju;
        }
    }
    inline long long llinit()
    {
        long long now=0,ju=1;char c;bool flag=false;
        while(1)
        {
            c=getchar();
            if(c=='-')ju=-1;
            else if(c>='0'&&c<='9')
            {
                now=now*10+c-'0';
                flag=true;
            }
            else if(flag)return now*ju;
        }
    }
    ll mod=1000000009LL;
    int n,a[1000001],d;
    int main()
    {
        ll ans=1;
        n=init();d=init();
        for(int i=1;i<=n;i++)
        {
            a[i]=init();
        }
        int id;
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)
        {
            id=lower_bound(a+1,a+i,a[i]-d)-a;
            ans=ans*(i-id+1)%mod;
        }
        printf("%lld",ans);
        return 0;
    }
    /*
    srO xudyh davidlee1999WTK linkct1999 Orz
    compiler TDM-GCC 5.9.2
    */
    View Code
  • 相关阅读:
    windows 开发 数据模版 Itemtemp
    windows 8 获取用户账号信息
    从客户端中检测到有潜在危险的 Request.Form 值解决方法
    asp.net异步处理
    知道web.config 中的 urlMappings怎么用?
    .net c#日期时间函数大全
    设计模式学习心得之工厂类模式(一)简单工厂模式
    远程网页内容抓取
    TreeView数据绑定的方法(1)
    URLRewriter.dll asp.net伪静态
  • 原文地址:https://www.cnblogs.com/redwind/p/6498893.html
Copyright © 2011-2022 走看看