zoukankan      html  css  js  c++  java
  • 【CSP膜你赛】大逃亡

    题目描述

      魔王撒旦为了建立魔物的乐土,率领亚多拉玛雷克、艾谢尔、路西菲尔、以 及马纳果达这四位恶魔大元帅进攻人类世界。然而此时手持圣剑的勇者艾米莉亚出现了。
      战败的魔王逃跑时穿越到了地球,以真奥贞夫的身份过着打工族的生活。最近真奥贞夫手头有点紧,他接到一个待遇不错的任务,但是却没有时间。无奈之下,他只能找到可靠的 YxuanwKeith 来帮忙。 然而王导最近忙于筹拍宣传片,抽不出时间,于是 YxuanwKeith 又找到了你来替他完成这个工作。YxuanwKeith 帮忙的工作是为一个大赛设计分队方式。

      这个比赛有 N 个人参加,我们可以给这 N 个人分任意数量(不超过N)的队伍,相同队伍的人用相同数字来表示。如果有多种表示,我们认为字典序最小的表示才是有效的。
      由于组队的情况实在是太多了,今年大赛组委会决定在比赛的第 i 天采用所有序列中字典序第i小的分队方式。
      现在组委会会向你询问一个序列,希望你能告诉他们这个序列的分队方式会在哪一天被采用。由于答案可能会很大,所以组委会只关心对1000007取模后的结果。

    输入格式

      第一行,一个整数 N 表示参赛人数。
      第二行,N 个整数,表示询问的分队方式的序列。

    输出格式

      一行,一个整数表示这种方式会在第几天被采用。答案对 1,000,007 取模。
    输入样例
      3
      1 2 2
    输出样例
      4
    提示
      比赛各天的分队情况如下:第一天:1,1,1第二天:1,1,2第三天:1,2,1第四天:1,2,2第五天:1,2,3
      对于100%的数据,N ≤10000,数据保证询问的数列是一个有效的序列。

    分析

      先来看一下什么是合法的序列。

      因为字典序最小,所以序列的前缀最大值每次最多上升1(不然就可以将它替换成更小的编号)

      然后我们来看如何计算字典序

      考虑一下与原序列s有相同前缀,但在i位开始与s不同的序列的个数

      设s在i位置的数为a[i],前缀的最大值为mx

      对于在位置i的数大于a[i]的序列,又因为前缀相同,所以它们字典序肯定比s大

      对于在位置i的数等于a[i]的数列。。。。。。不是说了在i位开始不同的吗。。直接递归到i+1位计算贡献就好了。

      对于在位置i的数小于a[i]的序列,又因为前缀相同,所以它们字典序肯定比s小,这些都可以产生贡献

      而这些序列的性质是前缀最大值为mx,长度为n-i+1,第i位小于a[i]。

      直接设dp式子dp[i][j]表示前缀最大值为j,剩下i位的不同方案个数

      那么这些序列的贡献就是$(a[i]-1)*dp[n-i][mx]$

      考虑怎么求dp式子

      那么每次就有更新最大值与不更新最大值两种方案

      $$dp[i][j]=j imes dp[i-1][j]+dp[i-1][j-1]$$

      处理出$n^2$这个数组然后对原序列一位一位的去计算贡献$(a[i]-1)*dp[n-i][mx]$就好了

      当然也可以直接dp需要的值,即在dp的时候就把(a[i]-1)放进去(这个无法用语言表达,具体看代码吧

      Code

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=10005;
    const int mod=1e6+7;
    int n,mx,nw,f[2][maxn];
    int main()
    {
        scanf("%d",&n);
        for(int i=1,a;i<=n;nw=!nw,i++)
        {
            scanf("%d",&a);
            for(int j=i;j>=1;j--)
            f[nw][j]=(f[!nw][j-1]+1ll*f[!nw][j]*j+(j==mx)*(a-1))%mod;
            mx=max(mx,a);
        }
        int ans=1;
        for(int i=1;i<=n;i++)ans=(ans+f[!nw][i])%mod;
        printf("%d
    ",ans);
    }
  • 相关阅读:
    JS事件冒泡
    iis设置Gzip后,无后缀的url无法压缩解决 MVC iis GZIP
    SQL中的循环、for循环、游标
    采用CDN加速后,如何在程序里获取用户IP地址
    Resharper 的快捷键
    JS防后退跳转
    ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
    Log4net创建日志及简单扩展
    统治世界的十大算法
    ffmpeg save rtsp stream
  • 原文地址:https://www.cnblogs.com/firecrazy/p/11811143.html
Copyright © 2011-2022 走看看