zoukankan      html  css  js  c++  java
  • 模拟46 题解

    A. Set

    原序列中,一定存在一段连续的区间,保证区间和整除n。

    不妨将区间和表示为前缀和的形式,

    如果存在任意两个相同的取值,那么该区间合法。

    而前缀和总共有n+1个,不同的取值最多有n个,固一定存在至少一个合法区间。

    B. Read

    题意其实是问序列中是否存在大于$frac{n+1}{2}$的众数。

    如果存在,那么求出这个众数出现了多少次。

     

    然而数组根本开不下,没有办法使用常规扫一遍的求众数方法。

    尝试利用一下题中的特殊性质:只需要考虑这个众数大于$frac{n+1}{2}$的情况。

    只要在扫一遍序列的过程中,不断维护当前的数,当前数的个数就可以了。

    分别计为id,cnt。

    如果cnt=0,将id设为该数,cnt=1

    如果该数等于id,cnt++

    如果该数不等于id,cnt--

    扫一遍之后求出id,再扫一遍,统计有多少个数等于id就可以了。

    C. Race

    暴力dp是在trie树上求出每个选手在每个排名上的方案数,dp转移很显然。

    然而这个dp的状态数已经达到了至少$n^2m$级别,

    最后统计答案也要$n^2$级别,根本不可能通过$n=200000$。

    正解是拆开题中给出的式子:

    排名为x的选手,得分为$x^2$,

    实际含义是:能力大于他的每个有序选手对(两者可以相同),会作出贡献1。

    所以只要在trie树上统计:

    对于每一个选手,m-1至i+1位相同,第i位开始不同的选手个数,设为$f[i]$。

    枚举开始不同的两个位置,使这些选手的权值都大于本选手,

    $ans=sum limits_{i=0}^{m-1} sum limits_{j=0}^{m-1}f[i]*f[j]*2^{i==j?m-1:m-2}$

    显然当$[位置1=位置2]$转移的系数为$2^{m-1}$,表示二进制的该位置受到限制,只有一种选择,其它位置任选。

    否则,转移系数为$2^{m-2}$,表示两个位置均任选。

    这个式子可以简单地化简,变成

    $ans=sum limits_{i=0}^{m-1} sum limits_{j=i}^{m-1}2*f[i]*f[j]*2^{m-2}$

             $=sum limits_{i=0}^{m-1} sum limits_{j=i}^{m-1}f[i]*f[j]*2^{m-1}$

    这样暴力打,复杂度是$O(nm^2)$的,随便优化一下就$O(nm)$了。

  • 相关阅读:
    HDU 六度分离
    HDU 找到唯一的冠军
    最短路径问题
    (拓扑排序)确定比赛名次
    Shortest Prefixes
    2768: [JLOI2010]冠军调查( 最小割 )
    BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)
    BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)
    BZOJ 2424: [HAOI2010]订货(最小费用最大流)
    BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)
  • 原文地址:https://www.cnblogs.com/skyh/p/11547961.html
Copyright © 2011-2022 走看看